我通过:collection选项将一个集合(@feed_items)传递给_feed_item部分。在 _feed_item 部分内,我想渲染另一个部分 _like_button 。在 _like_button 部分中,我希望能够访问该集合的特定成员。我应该从 _feed_item 部分传递到 _like_button 部分?
@feed_items = current_user.user_feed.order("id DESC").limit(5)
_feed.html.erb
<%= render partial: 'shared/feed_item', collection: @feed_items %>
_feed_item.html.erb
<%= render 'likes/like_button', ????? %>
_like_button.html.erb
<% if like = current_user.likes.find_by_feed_id(feed_item.id) %>
修改
根据以下答案传递局部变量:
<%= render :partial => 'likes/like_button', :locals =>{:feed_item => feed_item} %>
然而,在提交之后,我在尝试通过ajax再次呈现表单时得到ActionView::Template::Error (undefined local variable or method 'feed_item'
。如何通过ajax调用再次传递局部变量?
控制器
class LikesController < ApplicationController
def create
@like = Like.create(params[:like])
@feed = @like.feed
render :toggle
end
def destroy
like = Like.find(params[:id]).destroy
@feed = like.feed
render :toggle
end
end
toggle.js.erb
$("#like").html("<%= escape_javascript render('like_button') %>");
_like_button.html.erb
<% if like = current_user.likes.find_by_feed_id(feed_item.id) %>
<%= form_for like, :html => { :method => :delete }, :remote => true do |f| %>
<%= f.submit "Unlike" %>
<% end %>
<% else %>
<%= form_for current_user.likes.build(:feed_id => feed_item.id), :remote => true do |f| %>
<%= f.hidden_field :feed_id %>
<%= f.hidden_field :user_id %>
<%= f.submit "Like" %>
<% end %>
<% end %>
_feed_item.html.erb
<div id="like">
<%= render :partial => 'likes/like_button', :locals =>{:feed_item => feed_item} %>
</div>
答案 0 :(得分:7)
<%= render :partial => 'likes/like_button', :locals =>{:feed_item => feed_item} %>
Rails有一些很棒的文档http://guides.rubyonrails.org/layouts_and_rendering.html#passing-local-variables
在toggle.js
$("#like").html("<%= escape_javascript(render :partial => 'likes/like_button', :locals =>{:feed_item => @feed}) %>");
答案 1 :(得分:1)
您需要将feed_item
变量作为本地传递给_like_button.html.erb
部分。
<%= render 'likes/like_button', :locals => { :feed_item => feed_item } %>
这只是将内部部分中的本地名为feed_item
设置为外部部分中的feed_item
。
答案 2 :(得分:1)
使用集合渲染局部变量时,您将获得与渲染文件名相同的局部变量。所以只需将文件名作为局部变量传递。
例如,如果您有_feed_item.html.erb,并且您正在使用
这样的集合渲染此部分render "feed_item", collection: @feed_items
因此,您将在此feed_item部分内获取feed_item局部变量。
因此,您可以将此feed_item变量作为局部变量传递给另一个部分(在您的情况下为_like_button.html.erb)
答案 3 :(得分:0)
如果我理解,您必须执行以下操作:
<强> _feed.html.erb 强>
<%= render partial: 'shared/feed_item', collection: @feed_items %>
<强> _feed_item.html.erb 强>
在这里,您要定义一个名为feed_item
的局部变量,并将该值作为集合的每个元素进行分配。您可以省略单词locals
,因为Rails足够聪明,知道这是一个local
变量。
<% @feed_items.each do |feed_item| %>
<%= render 'likes/like_button', feed_item: feed_item %>
<% end %>
<强> _like_button.html.erb 强>
<% if like = current_user.likes.find_by_feed_id(feed_item.id) %>
希望它对你有所帮助。