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'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、コレクションの各要素として値を割り当てています。Railsは変数localsであることがわかるほど賢いので、この単語は省略できます。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 に答える