2016-05-08 14 views
0

私はレールで初心者だと私は私のコントローラ上の2のDateTimeを比較する必要があります。レール:nilのための未定義のメソッド `>」:NilClass

@b = Book.find(params[:book][:id]) 
if @b.expiry_date > DateTime.now 
    ... something here ... 
end 

しかし、私はこのエラーを取得する:

undefined method `>' for nil:NilClass 

誰もがなぜ考えているのですか?

@b = Book.find(params[:book][:id]) 
     if [email protected]_date.nil? && @b.expiry_date > DateTime.now 
     ... something here ... 
    end 

すべての書籍は、あなたが含まれている有効期限を主張し、検証を追加する必要がありどうぞ有効期限を持っていることになっている場合:

+2

これは、特定のブックオブジェクトの 'expiry_date'が' nil'であることを意味します。 – Pavan

答えて

3

演算子はルビーのメソッドなので、undefined method '>' for nil:NilClassエラーは@b.expiry_dateがこの行のnilであることを示します。if @b.expiry_date > DateTime.now

@b.expiry_dateが存在する場合、短絡ロジックを使用して条件を評価することができます。

if @b.expiry_date && (@b.expiry_date > DateTime.now) 

&&の両側も真であるので、(@b.expiry_date > DateTime.now)が第一の条件場合に実行されない、@b.expiry_date場合の式にのみ真である場合、偽又はゼロです。

それ以外の場合は、論理/検証を追加して、expiry_dateの存在を確認する必要があります。

+0

正確には、 '@ b'の' expiry_date'は '@b'ではなくnilです。 – Pavan

+0

あなたが正しいです、私は私が書いていたときに私は自分よりも前にいます。 –

0

ちょうど示すように、レコードは、あなたのif文ではnilでないことを確認を追加しますあなたのブックモデルでブックレコードを作成/更新するときに!

関連する問題