1

在遍历我的 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:NilClass 的未定义方法“名称”。但是,如果我将发生错误的行更改为“<%= @items[item.id].class %>”,则表明该类是 Item 而不是 nil。此外,如果我将数字硬编码,例如“.jpeg”>“rails 正确输出图片。

4

2 回答 2

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 %>
于 2012-09-29T03:02:25.870 回答
2

您已经在遍历@items数组,变量中的每个项目item。但是,不能保证.id每个项目的属性都对应于它在@items数组中的确切位置。如果item您的数据库中的每个都有不同.id的 ,则无法保证您的@items数组中甚至有那么多项目。

例如,在这个数组中:

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

每个项目都有索引0和数组1@items但是,尝试通过 do 来查找“上一个”项目将导致 Ruby在数组@items[item.id - 1]中的索引处寻找一个项目——该项目不存在。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 %>
于 2012-09-29T02:55:42.087 回答