Rails 2.3.2应用程序中的NoMethodError

时间:2011-10-12 09:51:12

标签: ruby-on-rails ruby

我在我的某个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安装问题?

2 个答案:

答案 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对象具有此方法

您的比较运算符仅适用于整数类