0

我试图在我的控制器中比较两个日期这是代码

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

如果在我的控制器中为真而在控制台中为假,则相同,我认为这是问题所在

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方法是否不会nil为非nil对象返回。

于 2012-12-25T22:24:09.827 回答
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
于 2012-12-25T22:26:20.853 回答
0

检查模型中的语法,包括验证。我在网上看到的有关此类错误的所有答案都只是语法错误。这个错误本质上是说你试图在左边的对象上调用一个比较,这恰好不存在,所以它可能是你的模型或验证的问题。

于 2012-12-25T22:28:23.530 回答
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

除此之外,您将日期存储为字符串是否有充分的理由?

于 2012-12-25T22:40:49.773 回答