0

如果这看起来像重复,我深表歉意,但我没有看到明确解释的解决方案。我有一个简单的 has_one, belongs_to 关联

class Author < ActiveRecord::Base
  attr_accessible :name, :book_attributes
  has_one :book
  accepts_nested_attributes_for :book, :allow_destroy => true  
end

class Book < ActiveRecord::Base
  attr_accessible :title, :author_id
  belongs_to :author
end

authors_controller

class AuthorsController < ApplicationController
  def index
    @authors = Author.includes(:book).all

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @authors }
    end
  end

 def show
    @author = Author.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @author }
    end
  end

 def new
    @author = Author.new
    @book = @author.build_book    

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @author }
    end
  end

这个 Show.html.erb 是表演的终结者,@author.book.title 给了我一个 nil:NilClass 的未定义方法:

<p id="notice"><%= notice %></p>

<p>
  <b>Name:</b>
  <%= @author.name %>
</p>

<p>
  <b>Book:</b>
  <%= @author.book.title %><br/>
</p>

<%= link_to 'Edit', edit_author_path(@author) %> |
<%= link_to 'Back', authors_path %>
4

3 回答 3

0

如果作者没有书,@author.book会返回nil,然后你继续打电话nil.title,它会爆炸。

你需要提防这种情况。也许是if围绕相关代码的声明:

<% if @author.book %>
  <%= @author.book.title %>
<% else %>
  (none)
<% end %>
于 2013-01-12T20:06:10.460 回答
0

您要显示的作者似乎有一本零书。所以当你这样做时@author.book.title,你会得到错误,因为titleis not a method on nil:NilClass.

要解决此问题,您需要通过以下方式检查 nil 标题:

@author.book.try(:title)

或者,通过将其添加到您的 Author 模型中,确保所有作者在被认为有效之前始终拥有一本书:

validates :book_id, :presence => true
于 2013-01-12T20:06:20.117 回答
0

Book 为 nil,因为它尚未分配给 Author。

<%= @author.book.nil? ? link_to 'Add Book', path(@author) : @author.book.title %>

或者

<%= @author.book.nil? ? 'No Titles available' : @author.book.title %>
于 2013-01-12T20:22:38.780 回答