首页 文章

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

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

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 %>
    
  • 2

    您已经在 @items 数组上进行迭代,每个项目都在变量 item 中 . 但是,不能保证每个项目的 .id 属性将对应于 @items 数组中的确切位置 . 如果数据库中的每个 item 都有不同的 .id ,则无法保证 @items 数组中甚至包含很多项目 .

    例如,在这个数组中:

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

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


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

相关问题