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

作者_コントローラ

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

表示しようとしている著者の書籍はないようです。したがって、は nil:NilClass のメソッドではない@author.book.titleため、エラーが発生します。title

これを修正するには、次の方法で nil タイトルを確認する必要があります。

@author.book.try(:title)

または、これを Author モデルに追加して、有効と見なされる前に、すべての著者が常に本を持っていることを確認してください。

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

Book は、まだ Author に割り当てられていないため、nil です。

<%= @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 に答える