Ruby on Rails-передача переменных частичному внутри частичного

я передаю коллекцию (@feed_items) в _feed_item partial с помощью опции :collection. Внутри _feed_item частичный я хочу сделать еще один частичный _like_button. В _like_button partial я хочу иметь доступ к определенному члену коллекции. Что я должен проходить от _feed_item частично _like_button частично?

 @feed_items = current_user.user_feed.order("id DESC").limit(5)

_feed.формат html.Эрб

 <%= render partial: 'shared/feed_item', collection: @feed_items %>

_feed_item.формат html.Эрб

 <%= render 'likes/like_button', ????? %>

_like_button.формат html.Эрб

 <% 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.Эрб

 $("#like").html("<%= escape_javascript render('like_button') %>");

_like_button.формат html.Эрб

 <% 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.Эрб

    <div id="like">
      <%= render :partial => 'likes/like_button', :locals =>{:feed_item => feed_item} %>
    </div>

4 ответов


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

Rails имеет некоторые удивительные documention 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}) %>");

вам нужно пройти feed_item переменная как локальная для _like_button.html.erb частичное.

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

Это просто устанавливает локальное имя feed_item во внутреннем частичном быть чем угодно feed_item в наружный частичный.


при использовании collection для рендеринга частичного, поэтому вы получите локальную переменную, такую же, как имя файла рендеринга. Таким образом, вы можете передать имя файла как локальную переменную.

например, если у вас есть _feed_item.формат html.erb, и вы рендеринг этого частичного использования коллекции, как

render "feed_item", collection: @feed_items

таким образом, вы получите локальную переменную feed_item внутри этого частичного feed_item.

таким образом, вы можете передать эту переменную feed_item как локальную переменную другой частично (в вашем случае _like_button.формат html.erb)


если я понимаю, вы должны сделать следующее:

_feed.формат html.Эрб

 <%= render partial: 'shared/feed_item', collection: @feed_items %>

_feed_item.формат html.Эрб

здесь вы определяете локальную переменную под названием feed_item и присваивает значение как каждый элемент вашей коллекции. Вы можете опустить слово locals потому что Rails достаточно умен, чтобы знать, что это a local переменная.

 <% @feed_items.each do |feed_item| %>
 <%= render 'likes/like_button', feed_item: feed_item %>
 <% end %>

_like_button.формат html.Эрб

 <% if like = current_user.likes.find_by_feed_id(feed_item.id) %>

надеюсь, это поможет вам.