我在我的某个rails 2.3.2应用程序中遇到了这个奇怪的错误。
NoMethodError in Timesheet#index
undefined method '>=' for nil:NilClass
Extracted source (around line #27):
24: for alog in act_logs
25: if alog.user_id == session[:user_id].id
27: if(alog.log_date>=@dt.beginning_of_week()&& alog.log_date<=@dt.end_of_week())
据我所知,我认为alog.log_date
或@dt.beginning_of_week
为零。但是在第27行(此处未包括检查)之前的快速检查显示以下值:
#alog.log_date
Wed, 09 Feb 2011
#@dt.beginning_of_week()
Mon, 10 Oct 2011
现在,如果这些值都不为零,为什么我会在第27行遇到这个undefined method >= for nil:NilClass
错误。如果你们想知道为什么我称之为奇怪......因为
1.如果我使用==
运算符,一切正常。其他运营商如&gt;,&lt;产生同样的错误
这个代码正在另一台机器上运行。
我认为这不是代码问题。它是否与Ruby有关或可能是Rails安装问题?
答案 0 :(得分:2)
错误意味着alog.log_date
正好是零。 alog.log_date>=@dt.beginning_of_week()
与alog.log_date.>=(@dt.beginning_of_week())
相同,即&gt; =只是一个方法调用(带有一些语法糖)。如果后者是零,你会得到这样的东西:
ArgumentError: comparison of Time with nil failed
您可以在行的开头添加日期检查:
if (alog.log_date && alog.log_date >= @dt.beginning_of_week() && alog.log_date<=@dt.end_of_week())
但是,如果您认为日期永远不应为零,则可能需要为该字段添加默认值和/或状态验证。
答案 1 :(得分:1)
捕获此类错误的好方法是附加调试器
或者更简单的就是将值写入log,你应该把它放在:
Rails.logger.info( variable_to_log )
PS
它适用于等号运算符'==',因为nil对象具有此方法
您的比较运算符仅适用于整数类