Ruby on rails 比较两个未定义的日期方法`>';零级:零级

Ruby on rails 比较两个未定义的日期方法`>';零级:零级,ruby-on-rails,ruby-on-rails-3,ruby-on-rails-3.2,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.

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

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 

只需对语句重新排序,即可首先检查日期是否为
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

另外,检查
to_date
方法对于非
nil
对象是否没有返回
nil

您的问题在于
@user.payment.last.active\u直到

您应该在尝试访问该字段之前检查
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

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

到目前为止,
返回
nil
的唯一方法是当您有一个空字符串时。所有其他字符串都将引发某种异常。您需要检查空白字符串,而不是
nil?
,因为
“”.nil?==错误
。相反,请使用
@user.payment.last.active\u 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

除此之外,还有什么好的理由将日期存储为字符串吗

您是否检查@user.payment.last.active\u until是否有值?是的,它有..这是“2013-01-24”之前的值在您的付款表中是否有任何活动\u,直到该值为零?也就是说:
Payment.where(active_until:nil)。所有的
都是针对@user中的同一用户的控制台输出吗?否用户只有一条记录;是的,是同一个用户,但我只在这里检查elsif@user.payment.last.active_until.nil?Karaktor,你是对的,我的问题是@user.payment.last.active_until是空的,但如果我在rails控制台中检查,它有一个日期…我不明白为什么?@Jean你在控制台和服务器中使用相同的环境吗(即相同的数据库)。我检查了,但我只在这里检查elsif@user.payment.last.active_直到.nil?但字段中的此信息在“2013-01-24”之前处于活动状态所以我不明白为什么下一个if从不检查如果你在使用未定义的nil:NilClass方法崩溃,那么这意味着你有一个值是nil,我怀疑Time.now.to_date是nil。你如何确定@user.payment.last.active_until不是nil?不,Sean,这个字段不是字符串,而是日期,但我使用的是jq查询日历并将日期格式更改为“dd-mm-yy”