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

bot*_*bot 49 ruby-on-rails

我正在渲染这样的部分:

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

问题是我的部分期待变量'contact'.

ActionView::Template::Error (undefined local variable or method `contact'
Run Code Online (Sandbox Code Playgroud)

我只是想告诉部分期望一个变量contact.应该迭代@contactscontact.我怎么做?

bot*_*bot 121

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

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

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

<%= render :partial => "product", :collection => @products, :as => :item %>
Run Code Online (Sandbox Code Playgroud)

通过此更改,您可以访问@products集合的实例作为partial中的项本地变量."

  • 这有效,但*仅当您指定`partial:`*时.你不能做`render'product",集合:@projects,as :: item`.你需要指定`partial:'产品"`或`as`选项不适用. (5认同)
  • 哦,很好,这真的很好! (2认同)

mat*_*uck 15

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

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

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

如果这个命名很重要,你可以在没有集合选项的情况下明确地执行以下操作:

@contacts.each { |contact| render :partial => 'contacts/contact_tile', :locals => {:contact => contact } }
Run Code Online (Sandbox Code Playgroud)


Man*_*ava 9

最新语法是:

index.html.erb

<%= render partial: "product", collection: @products %>
Run Code Online (Sandbox Code Playgroud)

_product.html.erb

<p>Product Name: <%= product.name %></p>
Run Code Online (Sandbox Code Playgroud)

@products 部分用作 product

其中@products可以被视为Product.all 并且product可以被视为一行产品,即Product.first逐个循环所有产品.