Ruby on Railsには、レコードが存在しない可能性が想定されnilのエラーを防ぎます
-
12-09-2019 - |
質問
私は、単純な書籍アプリをチェックアウトを構築しています。私がしなければならないことの一つは、ブックがチェックアウトされているかどうかです。私はbook_check_outクラスを介して、わたしの民とブッククラスのセットアップの間に私の関連を持っています。私の目標は、本は現在チェックアウトされているかどうかを判断するために、本のchecked_outプロパティを使用することです。しかし、この本をチェックアウトし、私はbook.checked_out.XXXを参照していないときに私の現在の実装では、私はエラーをreceieve「あなたはそれを期待していなかったとき、はあなたがnilオブジェクトを持っている!の」私の目標はありますそれが現在にチェックアウトされている方を示してはい、その本がチェックアウトされていることを示し、他のビューで一部のビューでは2つの目的のために使用するbook.checked_outます。
class Person < ActiveRecord::Base
has_many :book_check_outs
has_many :books, :through => :book_check_outs
end
<時間>
class Book < ActiveRecord::Base
has_many :book_check_outs
has_many :people, :through => :book_check_outs
def checked_out
book_check_outs || false
end
end
<時間>
class BookCheckOut < ActiveRecord::Base
belongs_to :book
belongs_to :person
end
解決
(例えば、本はどちらかにチェックアウトできるか否か)、あなたは結果のデフォルトを想定する必要があります。この場合、我々は、(本は、デフォルトではチェックアウトされていない)、それは虚偽だと仮定することができます。
checked_out の行と同じ名前のメソッドを作成します:本モデルでは、あなたののにhas_manyを削除する
def checked_out
book_check_outs || false
end
このがはBookCheckOutsのいずれかを返す必要があります、またはインスタンスに関連付けられてどれも、FALSEが存在しない場合。それはあなたの関連付けを確認すると厄介なnilのオブジェクトエラーを除去する迅速、簡単、確実な方法を提供します。
編集また、単にTRUEまたはFALSEを返す、とbook_check_outsがnilかどうかであることを確認することで、最新のチェックアウトを返すことができませんでした。 Railsは、ブランクと呼ばれる方法を提供しますか?これはnilの両方を呼び出しますか?空?
def checked_out
!book_check_outs.blank?
end
私はルビーを愛する:)
他のヒント
それは実際に重要かどうかは忘れたが、明確さのために、あなたはhas_manyの上にhas_many関係を置きたいと思うかもしれません:。関係を通じて
BookCheckOuts、それにhas_one:私はまた、あなたがそれにhas_manyことBookクラスで宣言されなければならないことを確認していないchecked_out、checked_out以来、の実際のあなたはそれが上記の多くを持つと宣言BookCheckOutです。