Passing parameters to partial view

Ruby on-RailsRuby on-Rails-3

Ruby on-Rails Problem Overview


I have a view that displays multiple images and those images' associated tags. I decided to use a partial view for each image and its tags, but I am having trouble passing in the image object into the partial view. Here is the main view's relevant code:

<table>
  <% @images.each do |i| %>
    <tr>
      <%= render :partial => :image_tag, :image => i %>
    </tr>
  <% end %>
</table>

Here is the partial view's relevant code (partial view is named _image_tag.html.erb):

<table>
  <%= image.id %>
  <%= image_tag image.src %>
</table>

I read in this thread that I can pass in the image object the way that I am currently doing it. I tried passing in the id through an options hash on the render method, and that also didn't work. The error I am getting is:

undefined method `model_name' for Symbol:Class

centered around the line where I am calling render :partial in the main view.

Ruby on-Rails Solutions


Solution 1 - Ruby on-Rails

<%= render partial: "image_tag", locals: {image: i} %>

is how you would pass variables to partials.

Solution 2 - Ruby on-Rails

Something else to consider for those that may be having trouble sending value(s) to a partial. If you omit the 'partial:' before your partial path, like so...:

<%= render 'my_partial', :locals => {:greeting => 'Hello world', :x => 36} %>

...it seems you'll be unable to access the locals hash values directly. Rather, you would need to do the following:

<div>
  <h1> <%= locals[:greeting] %> , my x value is <%= locals[:x] %> </h1>
</div>

However, including 'partial:' before your partial path, like the following...:

<%= render partial: 'my_partial', :locals => {:greeting => 'Hello world', :x => 36} %>

...allows you to directly access the hash values, like so:

<div>
  <h1> <%= greeting %> , my x value is <%= x %> </h1>
</div>

Just something to consider, I was getting tripped up by this issue when trying to access the locals hash values and realized I had omitted the 'partial:' component.

Solution 3 - Ruby on-Rails

You can also pass the whole object to a partial like this:

<%= render :partial => "partialpath", :object => :image %>

You would replace i with image in your case and partial path with whatever your partial is called. Inside the partial it would have access to a local variable with the same name as the partials name. So if your partials name is "image" the local variable image will be the object you pass in.

EDIT: Looking at the rails guides looks like in rails 3 the :object is now accessed as an instance variable instead of a local so @image would be what you use in the partial.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionjnevelsonView Question on Stackoverflow
Solution 1 - Ruby on-RailsvincehView Answer on Stackoverflow
Solution 2 - Ruby on-RailsMFarmerView Answer on Stackoverflow
Solution 3 - Ruby on-RailsMsencenbView Answer on Stackoverflow