当迭代我的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正确输出图片。
答案 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 %>