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 の未定義のメソッド `name'。ただし、エラーが発生する行を「<%= @items[item.id].class %>」に変更すると、クラスが nil ではなく Item であることが示されます。また、「.jpeg」>」のように番号をハードコードすると、レールは画像を正しく出力します。

4

2 に答える 2

3

私が見ることができるものから:

@itemは定義されていません。おそらく@items.

コピー/貼り付けの代わりにそれを入力し、実際に@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 %>

それでもそれが得られる場合は、コレクションに nil があり、次のものが必要であることを意味します。

<% @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

@itemsvariable 内の各項目を使用して、既に配列を反復処理していますitem。ただし、.id各アイテムの属性が@items配列内の正確な位置に対応するという保証はありません。itemデータベース内のそれぞれに異なる がある場合、配列にそれだけ.id多くの項目があるという保証はありません。@items

たとえば、この配列では次のようになります。

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

各アイテムにはインデックス0と配列1があります。@itemsただし、実行して「前の」項目を見つけようとすると、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 に答える