未定义的方法`标签' for nil:NilClass即使设置了rails关联

时间:2018-02-07 17:09:37

标签: ruby-on-rails

我有两张桌子:

1)包含列名id,shelfmark和harddisk_id

的表存档

2)带有列id,标签

的硬盘表 / app / archive.rb

class Archive < ApplicationRecord
  belongs_to :harddisk
end
/ app / harddisk.rb

class Harddisk < ApplicationRecord
end

在views / archives / index.html.erb

  <% @archives.each do |archive| %>
    <tr>
      <td><%= archive.shelfmark %></td>
      <td><%= archive.harddisk.label %></td>
    </tr>
  <% end %>

我想要实现的是通过硬盘表显示硬盘标签。

但是我收到了一个错误:

  

未定义的方法`标签&#39;为零:NilClass

on

  

&lt;%= archive.harddisk.label%&gt;

我做错了什么?

更新

在Rails控制台中

> foo = Archive.where(shelfmark:"foo")

> [#<Archive:0x007f916e1c21e8,
id:1,
shelfmark: 'foo'
harddisk_id: 1
]


  > foo.harddisk.label

NoMethodError: undefined method `harddisk' for #<Archive::ActiveRecord_Relation:0x007f9170ea75c8>

这是否意味着,Rails协会不起作用?它似乎无法在归档表上使用harddisk_id来从硬盘表中检索标签。

1 个答案:

答案 0 :(得分:1)

正如塞尔吉奥在评论中指出的那样,错误正在发生,因为一些档案馆没有硬盘。 所以愚蠢而简单的方法就是防止异常被引发并安全地从方法调用链返回一个nil archive.harddisk.label变为archive&.harddisk&.label(Ruby 2.3或更高版本)或try(),如果硬盘为零,则返回零,无例外

 <% @archives.each do |archive| %>
    <tr>
      <td><%= archive.shelfmark %></td>
      <td><%= archive.harddisk.try(:label) %></td>
    </tr>
  <% end %>