How to pass parameters to controller method from view?

John Do wrote:

Controllers/files_controller.rb
class FilesController < ApplicationController
def export_database(obj)
    obj.save_to_file
end
end

Views/files/show.html.erb
<% [RmEnv, RmProc].each do |db_obj| %>
<%= button_to "export database #{db_obj}", :action => export_database, #
don't know how to pass parameter such that :obj => db_obj %>
<% end %>

Or any other suggestion on who to activate a method via user activity.

Generally you aren't going to pass an entire object from the client to
the server. Rather you will be passing an id of some sort, then doing a
find, then performing an action. Without knowing what your RmEnv and
RmProc objects look like, here is a guess:

Controllers/files_controller.rb
class FilesController < ApplicationController
    def export_database
        obj = SomeClass.find_by_id(params[:id])
        obj.save_to_file
    end
end

Views/files/show.html.erb
<% [RmEnv, RmProc].each do |db_obj| %>
<%= button_to "export database #{db_obj.name}", :action =>
:export_database, :id => db_obj.id %>
<% end %>

You very well may need to tweak this based on your application. If RmEnv
and RmProc are of different classes, then you will also need to pass
from the client which one you are wanting to export. I haven't tried
this, but it should work:

button_to "Export ...", :action => :export_database, :id => db_obj.id,
:class_name => db_obj.class.name %>

then in the controller

obj = (params[:class_name].constantize).find_by_id(params[:id})

which will take the string form of the class name and try to find a
class (constant) defined for it. It will then call the find method on
that class. You should add some error handling.

Peace.

So you can't really use a view call a controller/helper methods with
arguments via link?

Let's say I have a helper with method
def say_hello(string1, string2)
  puts "#{string1} say hello to #{string2}"
end

I know in the view, I can do
<% say_hello("Bob", "Jill") %>
and the console will print out "Bob say hello to Jill".

If I would like this helper method by activated by a user click, what's
the best way?

Something like
<% link_to "Say Hello", say_hello("Bob", "Jill") %> # if this actually
works

Phillip Koebbe wrote:

John Do wrote:

So you can't really use a view call a controller/helper methods with
arguments via link?

You can call helpers from views, but not controller methods. Keep in
mind that the view is what's going to get rendered to the client. So any
reference to a controller method is in the context of a client making
another request to the server, either via an ajax call or a standard
http request.

Let's say I have a helper with method
def say_hello(string1, string2)
  puts "#{string1} say hello to #{string2}"
end

I know in the view, I can do
<% say_hello("Bob", "Jill") %>
and the console will print out "Bob say hello to Jill".

If I would like this helper method by activated by a user click, what's
the best way?

Something like
<% link_to "Say Hello", say_hello("Bob", "Jill") %> # if this actually
works

In the view, you would have the link_to point to a controller method,
and in the view refer to the helper method. Let's start with an index
view that provides the link to say hello:

app/controllers/my_controller.rb

def index
end

def say_hello
end

app/views/my/index.html.erb

<%= link_to "Say Hello", :action => :say_hello %>

app/views/my/say_hello.html.erb

<%= say_hello('Bob', 'Jill') %>

app/helpers/my_helper.rb

def say_hello(string1, string2)
  puts "#{string1} say hello to #{string2}"
end

You could also look into passing string1 and string2 from the client to
the server, in which case you'd change the index view to

<%= link_to "Say Hello", :action => :say_hello, :string1 => 'Bob',
:string2 => 'Jill' %>

and the say_hello view to

<%= say_hello(params[:string1], params[:string2]) %>

Peace