Rails使用多个对象呈现部分

时间:2013-03-31 02:51:54

标签: ruby-on-rails

此代码工作正常:

<%= render 'sidebars/pages', :object => @categories = pages , :object => { @myobject => '1', @mmyobject => '2' } %>

如果我改为:

<%= render 'sidebars/pages', :object => { @categories => pages, @myobject => '1', @mmyobject => '2' } %>

然后当我尝试迭代@categories时,我从部分收到错误:

undefined method `each' for nil:NilClass

我对ruby和rails也很新,我感谢任何帮助。

干杯!

2 个答案:

答案 0 :(得分:12)

当您将:object传递给Rails部分时,局部变量(不是实例变量,以@开头)在partial中定义,其名称与partial相同。因此,对于部分sidebars/_pages.html.erb,您的本地变量将被称为pages

pages局部变量的值是您作为:object选项的值传递的哈希值,并且您在“外部”视图中没有的实例变量都可用(例如作为@categories@myobject)。因此,您需要通过pages本地变量访问这些内容。

你可能正在寻找这样的东西:

<%= render 'sidebars/pages', :object => { :categories => @categories, :myobject => '1', :mmyobject => '2' } %>

sidebars/_pages.html.erb中,您可能会遇到以下情况:

<p><%= pages[:myobject] %></p>

<ul>
<% pages[:categories].each do |category| %>
  <li><%= category %></li>
<% end %>
</ul>

有关详细信息,请参阅Rails路线布局和渲染指南Partials section

<强>更新

更好的解决方案是使用:locals选项,该选项接受一个哈希,其键成为局部变量的部分。例如:

<%= render 'sidebars/pages', :locals => { :categories => @categories, :myobject => '1', :mmyobject => '2' } %>

sidebars/_pages.html.erb中,您可能会遇到以下情况:

<p><%= myobject %></p>
<p><%= mmyobject %></p>

<ul>
<% categories.each do |category| %>
  <li><%= category %></li>
<% end %>
</ul>

答案 1 :(得分:1)

上面提到的这行代码:

<%= render 'sidebars/pages', :object => @categories = pages , :object => { @myobject => '1', @mmyobject => '2' } %

实际上不会引发任何错误,但也不会将@myobject和@mmyobject传递给视图。

以下是使用render方法指定多个对象的正确方法:

<%= render 'sidebars/pages', :object => [@categories = pages, @myobject = '2'] %>

像这样我可以将多个对象传递给视图,而不必多次定义:object。

*至少在我的知识范围内