Kyle
Kyle

Reputation: 1058

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?

Upvotes: 13

Views: 21152

Answers (4)

Amy.js
Amy.js

Reputation: 536

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!

Upvotes: 5

Jack McDade
Jack McDade

Reputation: 669

What sort of parameter? If it's a key for a GET request, convention would dictate using the url (e.g. params[:id] or a an active record path variable). If you want to POST something, you should be using a form. Otherwise, you could write a helper method to set a session variable or something, but think about your architecture and what you're semantically trying to do, and I'm sure someone here can help you out.

Upvotes: 1

DGM
DGM

Reputation: 26979

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)

Upvotes: 3

Simon Bagreev
Simon Bagreev

Reputation: 2859

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]

Upvotes: 12

Related Questions