2012-12-25 23 views
0

我想在我的控制器comparte兩個日期這裏是代碼比較了零兩個日期未定義的方法`>」:NilClass

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 

但是我有一個觀點在同一行顯示一些其他信息和它的偉大工程。

我不明白爲什麼在控制器不起作用。

在此先感謝您的幫助。


UPDATE

這裏是我的控制檯輸出

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

在我的控制器相同的,如果是真實的,在控制檯是假的,我認爲這裏是

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 
+0

您是否檢查@ user.payment.last.active_until是否有值? – pablomarti

+0

是的,它有..有價值active_until:「2013-01-24」 – Jean

+0

是否有您的付款表中沒有任何active_until爲零?那就是:'Payment.where(active_until:nil).all'是你在@user中使用的用戶的那個控制檯輸出嗎? –

回答

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方法不會返回nil對於非nil對象。

+0

我做過,但他們我只檢查,直到這裏elsif @ user.payment.last.active_until.nil? – Jean

+0

Karaktor,你是對的,我的問題是@ user.payment.last.active_until是空的,但如果我在rails控制檯中檢查它,它有一個日期...我不知道爲什麼? – Jean

+0

@Jean您是否在控制檯和服務器上使用相同的環境(即相同的數據庫)。 – Koraktor

0

你的問題是與@user.payment.last.active_until

嘗試之前訪問該字段,你可能會看到,它是空的

我創建了一個良好的習慣是,每一個你應該做的nil檢查如果價值不是nil,所以我不會意外地調用nil東西的方法,除非我絕對100%確定價值永遠不會是零。

payments = @user.payment 

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

,或者如果你想保持相同的代碼,你有那麼

if payments.count == 0 
    some action 
elsif !payments.last.active_until.nil? && payments.last.active_until.to_date > Time.now.to_date 
    some action 
elsif payments.last.active_until.nil? 
    some action 
end 
+0

我做了,但他們我只檢查,直到這裏elsif @ user.payment.last.active_until.nil?但該字段有這樣的信息active_until:「2013-01-24」所以我不承認,爲什麼下一個,如果從未檢查 – Jean

+0

如果你崩潰的'未定義的方法'>'零:NilClass'那麼這意味着你在那裏的價值是零,我懷疑Time.now.to_date是零。你怎麼確定@ user.payment.last.active_until不是零? –

+0

我剛剛用我的控制檯輸出更新了問題。 – Jean

0

檢查你的語法在你的模型,包括驗證。我在網上看到的關於這類錯誤的所有答案都只是語法錯誤。這個錯誤實質上是說你試圖對左側對象進行比較,而這恰好不存在,所以這可能是你的模型或驗證的問題。

0

to_date將返回nil的唯一方法是當您有一個空白字符串。所有其他字符串都會引發某種異常。您需要檢查空白字符串而不是nil?,因爲"".nil? == false。相反,使用@user.payment.last.active_until.blank?。這將檢查空白字符串和零。

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 

除此之外,有沒有什麼好的理由,你存儲日期爲字符串?

+0

沒有肖恩,該字段不是字符串是日期,但我使用jQuery日曆,並將dateformat更改爲'dd-mm-yy' – Jean

相關問題