2012-08-30 12 views
38

を指定@array:部分レンダリング:コレクション=>は、私はこのような部分をレンダリングしていた変数名

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

問題は、私の部分は、変数「連絡先」を期待しているということです。

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

変数を期待するだけです。contactです。 @contactscontactとして繰り返す必要があります。それ、どうやったら出来るの? http://guides.rubyonrails.org/layouts_and_rendering.html

答えて

102

これはまた、ドキュメントから有用であるが見つかりました。あなたが部分的にちなんで名付けられた変数を有することに限定されない:

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

を指定して、部分内のカスタムローカル変数名を使用するには、次の部分への呼び出しのオプションとして:

この変更に伴い
<%= render :partial => "product", :collection => @products, :as => :item %> 

、あなたは部分的内アイテムのローカル変数として@productsコレクションのインスタンスにアクセスすることができます。」

+2

ああ、それは本当にうまくいきます! – Avishai

+0

これは、Rails 4.1で私が間違って動作していません。それは4.2か何かに追加されましたか? – jrochkind

+1

これは動作しますが、 'partial:' *を指定した場合のみ*です。 'render 'product"、collection:@projects、as::item'を実行することはできません。 'partial:" product "'を指定するか、 'as'オプションは適用されません。 – coreyward

12

ドキュメントは言う:

を部分的に複数形のコレクションで呼び出された場合、その部分の 個々のインスタンスは、後という名前の変数を経由してレンダリングされている コレクションのメンバーへのアクセス権を持っています部分的です。

"contact"の代わりに "contact_tile"という変数が渡されます。おそらくあなたの部分的な名前を変更することができます。このネーミングが重要な場合

、あなたが何かによって収集オプションを指定しないで明示的にそれを行うことができます:

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

+1私は残りの人生のためにあなたをアップウォークしたい – botbot

+1

以下の答えを参照してください。 :asオプションを使って変数の名前を上書きすることで、この動作をオーバーライドするのは簡単です。 – botbot

+0

あなたは単に 'render @ contacts'と書いても構いません。 '@ contacts'は' Contact'インスタンスの配列なので、すべての 'contact'レコードは' to_partial_path'呼び出しで ''contacts/contact''を返します(Railsはこれをフードの下で行います)。 http://api.rubyonrails.org/classes/ActionView/PartialRendererhtml#class-ActionView :: PartialRenderer-label-Rendering + the +デフォルト+ケース – dskecse

7

最新の構文は次のとおり

index.html.erb

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

_product.html.erb

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

@productsは@productsであることができるproduct

として部分的に使用されていますProduct.allproductと考えることができます商品の行として、すなわちすべてProduct.firstが1つ1つループされて表示されます。