nil的未定义方法`name':来自连接表的属性的NilClass

时间:2015-03-21 17:47:57

标签: ruby-on-rails activerecord

我有一个简单的问题。 我有2个表:书籍和读者。他们是这样加入的:

class Book < ActiveRecord::Base
 belongs_to :reader
end

class Reader < ActiveRecord::Base
 has_many :books
end

所以,在数据库中,我有一本书有一个指定的读者,在视图中我在一个块中有这样的一行:

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

但它表示存在错误undefined method name for nil:NilClass,但如果我用

更改它
<td><p><%= book.reader %></p></td>

它显示了object: Reader:0x007fa60ea72f40

的地址

请你告诉我这里发生了什么事?我想它应该显示一个读者的名字......

我模型的架构是:

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

2 个答案:

答案 0 :(得分:2)

您可以使用try方法解决此问题。你可能有一些没有作者的书籍,这就是你打电话book.author的原因,你得到nil,当你打电话给name方法时。这导致了NoMethodError异常。尝试使用

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

答案 1 :(得分:1)

  

nil的未定义方法`name':NilClass

我认为你有一些没有读者关联的书。因此,当您尝试访问nil阅读器的name属性时,它会变得异常。

因此,nil使用try nilnil时,<% @books.each do |book| %> <%= book.reader.try(:name) %> <% end %> 调用{{1}},这将是很好的。

{{1}}