Cant pass local object to nested partial in Rails

2019-07-19 09:17发布

问题:

Im hoping that someone can shed light on what is probably a simple mistake. Im trying to pass a local variable, article, which is in the partial _article.html.erb, to another partial nested within _article.html.erb. When the partial code is in _article.html.erb, it works fine.I've tried many variations (including :locals) but cant seem to pass the local variable.

_article.html.erb

 <% if current_user.favorited?(article) %>     
            <%= render :partial => 'unfavorite', :object => article  %>
 <% else %>
            <%= render :partial => 'favorite', :object => article %>
 <% end %>

_favorite.html.erb (both favorite and unfavorite are more or less the same, so I've only posted one)

 <%= form_for current_user.favorites.find_by_article_id(article), :html => { :method => :delete,  :class => 'unfavorite_form', }, :remote => true do |f| %> 
            <div><%= f.hidden_field :article_id %></div>
            <%= image_submit_tag("vote-favorite-on.png", :alt => "Favorite", :id => "favorites_button", :title => "Remove from favorites") %> 
 <% end %>

The error message is:

       undefined local variable or method `article' for #<#<Class:0x491c2b0>:0x6727a58>

回答1:

The rails docs for rendering mention the use of object like this:

<%= render :partial => "customer", :object => @new_customer %>

And say that:

Within the customer partial, the customer variable will refer to @new_customer from the parent view.

Which makes it seem like the :object variable is translated into the name of the partial. So in your case, in _favorite, you'd have to use the favorite variable:

 <%= form_for current_user.favorites.find_by_article_id(favorite), :html => { :method => :delete,  :class => 'unfavorite_form', }, :remote => true do |f| %> 

Personally I prefer the locals syntax, because then you can be explicit:

<%= render :partial => 'favorite', :locals => {:article => article} %>