2012-08-30 38 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。應該通過@contacts作爲contact來迭代。我怎麼做?

回答

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:'*時纔有效。你不能'渲染'產品「,集合:@projects,如::item'。你需要指定'partial:「product」'或'as'選項不適用。 – coreyward

12

http://guides.rubyonrails.org/layouts_and_rendering.html文檔說:

當部分是帶一個多元化的集合,則該局部的 單個實例有通過命名後的變量被呈現訪問 集合的構件部分。

因此,它會傳遞一個名爲「contact_tile」而非「contact」的變量。也許你可以重新命名你的部分。

如果這種命名是很重要的,你可以明確地像做沒有收集選項:

@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/PartialRenderer。html#class-ActionView :: PartialRenderer-label-Rendering + the + default + case – dskecse

7

最新的語法是:

index.html.erb

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

_product.html.erb

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

@products在部分被用作product

在哪裏@products可以是視爲Product.allproduct可以考慮編輯爲一行產品,即Product.first將所有產品逐一循環。