我有两张桌子:
1)包含列名id,shelfmark和harddisk_id
的表存档2)带有列id,标签
的硬盘表class Archive < ApplicationRecord
belongs_to :harddisk
end
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来从硬盘表中检索标签。
答案 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 %>