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) %>
надеюсь, это поможет вам.