Ruby和Nil对象

时间:2009-11-11 17:55:00

标签: ruby-on-rails

我正在Ruby on Rails中开发一个webapp(很好的尝试)。

我的index.html.erb

中有部分渲染
<%= render :partial => "houses/index", :locals => @houses %>

当用户点击我的域的根目录时,会加载index.html.erb。这部分导致此错误:

You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each

第8行提取的来源

5:     <th>Washrooms</th>
6:   </tr>
7: 
8: <% @houses.each do |house| %>
9:   <tr>
10:     <td><%=h house.short_desc %></td>
11:     <td><%=h house.bedrooms %></td>

模板包含跟踪:app / views / home / index.html.erb

我想在我的主页上显示5个房屋(index.html.erb)

我错过了什么才能让它发挥作用?

非常感谢

编辑:

Houses_controller

Home #index

中的NoMethodError

显示第10行引出的app / views / houses / _index.html.erb:

当你没想到它时,你有一个零对象! 您可能期望一个Array实例。 评估nil.each时发生错误

提取的来源(第10行):

7:洗手间 8: 9: 10:&lt;%@ houses.each do | house | %GT; 11: 12:&lt;%= h house.short_desc%&gt; 13:&lt;%= h house.bedrooms%&gt;

模板包含跟踪:app / views / home / index.html.erb

3 个答案:

答案 0 :(得分:5)

值:locals应该是定义局部变量的Hash。所以

<%= render :partial => "houses/index", :locals => {:houses => @houses} %>

然后

<% houses.each do |house| %>

重申一下,因为您发布的新错误表明您仍未正确执行此操作:

如果您通过:locals传递,则需要houses.each,而不是**@**houses.each。没有蜗牛。局部变量没有@前缀;实例变量可以。

答案 1 :(得分:2)

Locals采用局部变量的哈希值,如下所示:

<%= render :partial => "houses/index", :locals => { :houses => @houses } %>

此外,当您将局部变量传递给partial时,您应该将其用作局部变量而不是partial中的实例变量,如下所示:

<% houses.each do |house| %>
# do stuff with each house
<% end %>

答案 2 :(得分:0)

如果它是实例变量,则无需在:locals中传递它。实例变量在所有部分中都可用。

在您看来:

<% @houses.each do |house| %>
  # do stuff with each house
<% end %>
相关问题