0

コントローラーで2つの日付を比較しようとしています ここにコードがあります

if @user.payment.count == 0
    some action
elsif @user.payment.last.active_until.to_date > Time.now.to_date
    some action
elsif @user.payment.last.active_until.nil?
    some action
end

これを評価しようとすると

elsif @user.payment.last.active_until.to_date > Time.now.to_date

次のエラーが表示されます。

undefined method `>' for nil:NilClass

しかし、他の情報を表示するビューに同じ行があり、うまく機能します。

コントローラーで動作しない理由がわかりません。

よろしくお願いします。


アップデート

ここに私のコンソール出力があります

1.9.3p286 :002 > u.payment.last.active_until
  Payment Load (0.2ms)  SELECT "payments".* FROM "payments" WHERE "payments"."user_id" = 10 ORDER BY "payments"."id" DESC LIMIT 1
 => Thu, 24 Jan 2013 

これをコンソールで比較すると、次のようになります。

1.9.3p286 :003 > u.payment.last.active_until.to_date > Time.now.to_date
  Payment Load (0.3ms)  SELECT "payments".* FROM "payments" WHERE "payments"."user_id" = 10 ORDER BY "payments"."id" DESC LIMIT 1
 => true 

更新 2

私のコントローラがtrueでコンソールがfalseの場合も同じですが、ここに問題があると思います

1.9.3p286 :010 > u.payment.last.active_until.nil?
  Payment Load (0.3ms)  SELECT "payments".* FROM "payments" WHERE "payments"."user_id" = 10 ORDER BY "payments"."id" DESC LIMIT 1
 => false 
4

4 に答える 4

2

ステートメントを並べ替えるだけで、日付が最初にチェックされnil?ます。

if @user.payment.count == 0
  some action
elsif @user.payment.last.active_until.nil?
  some action
elsif @user.payment.last.active_until.to_date > Time.now.to_date
  some action
end

PS: さらに、メソッドが非オブジェクトに対してto_date返されないことを確認してください。nilnil

于 2012-12-25T22:24:09.827 に答える
0

to_date返される唯一の方法nilは、空白の文字列がある場合です。他のすべての文字列では、何らかの例外が発生します。の代わりに空白文字列をチェックする必要がありnil?ます"".nil? == false。代わりに、を使用して@user.payment.last.active_until.blank?ください。これにより、空白文字列と nil がチェックされます。

if @user.payment.count == 0
    some action
elsif @user.payment.last.active_until.blank?
    some action
elsif @user.payment.last.active_until.to_date > Time.now.to_date
    some action
end

それ以外に、日付を文字列として保存する正当な理由はありますか?

于 2012-12-25T22:40:49.773 に答える