我正试图在我的控制器中分隔两个日期,这是代码
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
答案 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
除此之外,您是否有充分的理由将日期存储为字符串?