比较两个日期未定义的方法`>'为零:NilClass

时间:2012-12-25 22:19:24

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.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

如果在我的控制器中是真的并且在控制台中是假的,我认为这是问题

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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:0)

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

答案 3 :(得分: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

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