59

我正在渲染这样的部分:

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

问题是我的部分期望变量“联系人”。

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

我只是想告诉部分期望一个变量contact。应该遍历@contactsas contact。我怎么做?

4

4 回答 4

133

从文档中发现这也很有帮助。您不仅限于以部分命名的变量:

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

要在部分中使用自定义局部变量名称,请在对部分的调用中指定 :as 选项:

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

通过此更改,您可以访问 @products 集合的实例作为部分中的项目局部变量。”

于 2012-10-05T23:40:01.250 回答
16

http://guides.rubyonrails.org/layouts_and_rendering.html上的文档说:

当使用复数集合调用分部时,分部的各个实例可以通过以分部命名的变量访问正在呈现的集合的成员。

因此它将传递一个名为“contact_tile”而不是“contact”的变量。也许你可以重命名你的部分。

如果此命名很重要,您可以在不使用 collection 选项的情况下通过以下方式显式执行此操作:

@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 并且product可以被视为一行产品,即Product.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 回答