Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pass Parameters in Link_to

I would like to pass a parameter through a link_to method in Rails. I know there is a way to do it via the URL but I really don't want to do that. Is there any way to pass a param via a link without adding it to the link itself?

I know in PHP you can post and then retrieve that value by using the post variable. Is there something similar in Rails?

like image 329
Kyle Avatar asked Feb 21 '12 13:02

Kyle


People also ask

How do you pass parameters in Rails?

Passing Params Through the URLBy adding the id "22" to the end of their URL, the user is specifying which profile they'd like to see. As a result, we now have access to this id, and can use it to show the user exactly what they're looking for by using the params[:id] in our UsersController show action.

What is Params ruby on rails?

As you might have guessed, params is an alias for the parameters method. params comes from ActionController::Base, which is accessed by your application via ApplicationController. Specifically, params refers to the parameters being passed to the controller via a GET or POST request.


3 Answers

link_to signature looks as follows:

link_to(body, url_options = {}, html_options = {})

So, POST would look like (lets say you want to POST user's data):

link_to "Link text", some_path(:foo => "bar", :baz => "quux"), user: @user, :method => :post

User's data can be retrieved in the controller using params[:user]

like image 187
Simon Bagreev Avatar answered Oct 21 '22 01:10

Simon Bagreev


Here's how you can pass a parameter around via the link_to method in order to, say, create a new object with the passed parameter. This strategy would allow you to pass variables among actions in your controller and create objects with predefined attributes:

Say in your show view, you have a variable called @foo that you want to pass to your new controller action. In which case, in your show view, you can have

<%= link_to "Link Text", new_widget_path(:foo => @foo) %>

which would store @foo in params[:foo], allowing you to use params[:foo] in your controller. Which controller action you get directed to depends upon *new_widget_path*. In this case, you get directed to the new action in WidgetController.

Clicking on Link Text will direct Rails to the new action of your WidgetController. You can have

def new
  @widget = Widget.new(:foo => params[:foo])
end

Then, in your new.html.erb view file, you can allow the user to create a new Widget object with this pre-defined foo attribute already filled out via a hidden form field:

 <%= form_for(@widget) do |f| %>
  <%= f.label :other_attribute %><br />
  <%= f.text_field :other_attribute %>
  <%= f.hidden_field :foo %>
  <%= f.submit %>
<% end %>

Allowing the user to create a new widget with the foo attribute already filled out!

like image 5
Amy.js Avatar answered Oct 21 '22 01:10

Amy.js


Passing information through a web request can be done either by the URL: http://example.com/foo?bar=blah in a GET request which is what link_to does, or through a POST operation which usually requires a form. The form could have hidden elements if you just want a submit button:

<form method="POST" action="http://example.com/foo">
  <input type="hidden" name="bar" value="blah">
  <input type="submit">
</form>

There are various rails helpers to help build the form if needed.

Lastly, if you really want a link, you could either CSS style that button, or you could use javascript to observe a link and then POST the info. (the method Simon Bagreev posted does this with javascript)

like image 3
DGM Avatar answered Oct 21 '22 03:10

DGM