9

我通过 :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} %>

ActionView::Template::Error (undefined local variable or method 'feed_item'但是,在提交 like 之后,当它尝试通过 ajax 再次呈现表单时,我得到了一个。如何通过 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

切换.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>
4

4 回答 4

8
 <%= render :partial => 'likes/like_button', :locals =>{:feed_item => feed_item} %>

Rails 有一些很棒的文档http://guides.rubyonrails.org/layouts_and_rendering.html#passing-local-variables

在切换.js

 $("#like").html("<%= escape_javascript(render :partial => 'likes/like_button', :locals =>{:feed_item => @feed}) %>");
于 2012-09-04T07:15:36.133 回答
1

您需要将feed_item变量作为局部变量传递给局部变量_like_button.html.erb

<%= render 'likes/like_button', :locals => { :feed_item => feed_item } %>

这只是将feed_item内部部分中命名的本地设置为feed_item外部部分中的任何内容。

于 2012-09-04T07:15:22.330 回答
1

当使用集合渲染部分时,您将获得与渲染文件名相同的局部变量。因此,您可以将文件名作为局部变量传递。

例如,如果您有 _feed_item.html.erb 并且您正在使用集合呈现此部分

render "feed_item", collection: @feed_items

因此,您将在这个 feed_item 部分中获得 feed_item 局部变量。

因此,您可以将此 feed_item 变量作为局部变量传递给另一个部分(在您的情况下为 _like_button.html.erb)

于 2012-09-04T07:26:05.223 回答
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) %>

希望它可以帮助你。

于 2012-09-04T08:53:02.500 回答