渲染部分:集合=> @array指定变量名称

时间:2012-08-30 00:34:57

标签: ruby-on-rails

我正在渲染这样的部分:

$("#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 个答案:

答案 0 :(得分:114)

发现这对文档也有帮助。您并不局限于以partial:

命名的变量

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

  

要在partial中使用自定义局部变量名,请指定   :作为调用partial的选项:

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

通过此更改,您可以访问@products集合的实例作为partial中的项本地变量。&#34;

答案 1 :(得分:15)

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

  

当使用复数集合调用partial时,则   部分的个别实例可以访问该成员   通过以partial为名称的变量呈现集合。

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

如果这个命名很重要,你可以在没有收集选项的情况下明确地做到这一点:

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

答案 2 :(得分:8)

最新语法为:

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逐个循环所有产品。

答案 3 :(得分:0)

您可以使用关键字 as:

将自定义变量名称指定为默认值
<%= render partial: 'line_items/line_item', collection: order.line_items, as: :item %>