59

私はこのような部分をレンダリングしています:

$("#box_container").html("<%= escape_javascript( render :partial => 'contacts/contact_tile', :collection => @contacts) %>")

問題は、私のパーシャルが変数'contact'を期待していることです。

ActionView::Template::Error (undefined local variable or method `contact'

パーシャルに変数を期待するように伝えたいだけですcontact@contactsとして繰り返す必要がありcontactます。それ、どうやったら出来るの?

4

4 に答える 4

133

これはドキュメントからも役立つことがわかりました。パーシャルにちなんで名付けられた変数を持つことに限定されません:

http://guides.rubyonrails.org/layouts_and_rendering.html

パーシャル内でカスタム ローカル変数名を使用するには、パーシャルの呼び出しで :as オプションを指定します。

<%= render :partial => "product", :collection => @products, :as => :item %>

この変更により、パーシャル内の item ローカル変数として @products コレクションのインスタンスにアクセスできます。」

于 2012-10-05T23:40:01.250 に答える
16

http://guides.rubyonrails.org/layouts_and_rendering.htmlのドキュメントには次のように記載されています。

パーシャルが複数化されたコレクションで呼び出されると、パーシャルの個々のインスタンスは、パーシャルにちなんで名付けられた変数を介して、レンダリングされるコレクションのメンバーにアクセスできます。

そのため、「contact」の代わりに「contact_tile」という変数が渡されます。おそらく、パーシャルの名前を変更できます。

この命名が重要な場合は、次のようにして、コレクション オプションなしで明示的に行うことができます。

@contacts.each { |contact| render :partial => 'contacts/contact_tile', :locals => {:contact => contact } }

(コメンターが指摘したように、これはパフォーマンスが悪いかもしれませんが)

于 2012-08-30T01:53:17.343 に答える
13

最新の構文は次のとおりです。

index.html.erb

<%= render partial: "product", collection: @products %>

_product.html.erb

<p>Product Name: <%= product.name %></p>

@productsとして部分的に使用されますproduct

@productsは製品の行と見なすことができます。つまりProduct.all 、すべての製品を 1 つずつループしたものと見なすことができます。productProduct.first

于 2013-10-21T09:22:21.120 に答える
1

キーワードを使用して、カスタム変数名をデフォルトとして指定できますas:

<%= render partial: 'line_items/line_item', collection: order.line_items, as: :item %>
于 2021-05-18T13:05:31.330 に答える