nil:NilClass 的 属性 的 table 的未定义方法“名称”

Undefined method `name' for nil:NilClass for a property from a joined table

我有一个简短的问题。 我有 2 个表:Books 和 Readers。他们是这样加入的:

class Book < ActiveRecord::Base
 belongs_to :reader
end

class Reader < ActiveRecord::Base
 has_many :books
end

所以,在数据库中我有一本分配了 reader 的书,在视图中我在一个块中有这样一行:

<td><p><%= book.reader.name %></p></td>

但是它说有一个错误undefined method name for nil:NilClass,虽然如果我把它改成

<td><p><%= book.reader %></p></td>

它显示了 object: Reader:0x007fa60ea72f40

的地址

你能告诉我这是怎么回事吗?正如我想的那样,它应该显示 Reader 的名字作为结果...

我的模型架构是:

ActiveRecord::Schema.define(version: 20150320182921) do

  create_table "books", force: :cascade do |t|
    t.string   "name"
    t.string   "author"
    t.integer  "pages"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer  "reader_id"
 end

  create_table "readers", force: :cascade do |t|
    t.string   "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

结束

undefined method `name' for nil:NilClass

我认为您有一些书没有 reader 关联。因此,当您尝试访问 nil reader 的名称属性时,它会出现异常。

所以在 nil 调用时使用 #trytry returns nil 来拯救 nil 会很好:

<% @books.each do |book| %>
  <%= book.reader.try(:name) %>
<% end %>

您可以使用 try 方法摆脱它。您可能有一些没有 作者 的书,这就是您调用 book.author 时得到 nil 的原因,而当您调用 [=14] 时=] 方法。这导致 NoMethodError 异常。尝试使用

来写
<%= book.author.try(:name) %>