Question

Many helper methods, such as redirect_to, link_to, and url_for, can take an ActiveRecord object as a parameter instead of a hash that specifies the controller and action. I've seen the parameter passed different ways in different documentation. It sometimes gets passed as a symbol, sometimes as an instance variable, and sometimes as a local variable.

I'm confused about how the different parameter styles get expanded to return urls. I know that following REST conventions should create a url constructed of a controller and action but am unsure when Rails needs a specific parameter style to construct that url. Please help me understand the use cases for passing the ActiveRecord object as a symbol, an instance variable, or a local variable. Are there different requirements based on the method call? Or are there underlying differences in url construction?

Here are some examples:

From the API docs:

link_to "Profile", @profile  
redirect_to post  
<%= url_for(@workshop) %>  
<%= form_for :person do |f| %> (this is described as the “generic #form_for”)

From the Ruby on Rails Guides:

<%= link_to 'New book', new_book_path %>  
redirect_to(@book)  
form_for(@article)  

From the Rails 3 Way:

'link_to' "Help", help_widgets_path, :popup => 1  
redirect_to post  
url_for(timesheets_path)  
form_for offer do |f|  

Note: Upon further research, it seems that form_for is able to accept a local variable in the case where the calling view template passes a :locals hash as a parameter. The keys are the locals that can be used in the partial and the values are the instance variables from the template. Is that the correct understanding?

Was it helpful?

Solution

  • You can pass objects to link_to and url_for
  • You can also pass an object to a path helper
  • Both @post and post are objects. @post is an instance variable, and post is either a local variable or a method that will return a post

The only "weird" one is the form_for :post variety. This is old school Rails syntax, and will change this to the form_for @post syntax under the hood.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top