Rails undefined方法`name'代表nil:NilClass

时间:2012-09-29 02:50:40

标签: ruby-on-rails class

当迭代我的Items数组时,我正在尝试打印该项目以及数组中的上一项,但是我遇到了一些困难。我要打印的每个图像都与项目名称相同。 我收到错误的代码如下:

<% @items.each do |item| %>
<img src="/assets/<%= item.name %>.jpeg" >
//This is where I get my error//
<img src="/assets/<%= @items[item.id - 1].name %>.jpeg" >
<% end %>

打印出错误:nil的未定义方法`name':NilClass。但是,如果我将发生错误的行更改为“&lt;%= @items [item.id] .class%&gt;”它表明该类是一个Item而不是nil。此外,如果我硬编码,例如“.jpeg”&gt;“rails正确输出图片。

2 个答案:

答案 0 :(得分:3)

从我所看到的:

@item未定义,您可能意味着@items,在这种情况下,您所做的事情很可能无法帮助您,因为您当前项目的ID与此无关集合中的索引。

如果不是复制/粘贴你输入的那个而你确实有@items,那么你仍然会遇到item.id - 1不是你的意思的问题。你可能意味着:

<% @items.each_with_index do |item, i| %>
<% i = i - 1 %>
<img src="/assets/<%= item.name %>.jpeg" >
//This is where I get my error//
<% unless i < 0 %>
<img src="/assets/<%= @items[i].name %>.jpeg" >
<% end %>
<% end %>

如果你仍然如此,那么这意味着你的收藏中有nils,你需要:

<% @items.compact.each_with_index do |item, i| %>
<% i = i - 1 %>
<img src="/assets/<%= item.name %>.jpeg" >
//This is where I get my error//
<% unless i < 0 %>
<img src="/assets/<%= @items[i].name %>.jpeg" >
<% end %>
<% end %>

答案 1 :(得分:2)

您已经在@items数组上进行迭代,并且变量item中的每个项目都是如此。但是,无法保证每个项目的.id属性与@items数组中的确切位置相对应。如果您的数据库中的每个item都有不同的.id,则无法保证@items数组中的项目数量确实很多。

例如,在这个数组中:

@items = {{id: 5}, {id: 10}}

每个项目在0数组中都有索引1@items。但是,尝试通过执行@items[item.id - 1]查找“上一个”项目将导致Ruby在4数组中的索引@items处查找项目 - 该项目不存在。


each_with_index会帮助您解决此问题 - 您可以使用它来获取数组中每个项目的实际索引,而不是取决于.id属性。像这样:

<% @items.each_with_index do |item, index| %>
    <img src="/assets/<%= item.name %>.jpeg" >
    <img src="/assets/<%= @items[index - 1].name %>.jpeg" >
<% end %>