“未定义的方法`[]'为nil:NilClass”而超级

时间:2015-02-09 10:53:41

标签: ruby-on-rails ruby redmine

我使用一些自定义脚本管理Redmine(2.3.2.stable.231,rails 3.2.13)并且它曾经很好地工作。但是最近,当我的脚本试图通过Redmine API销毁一个问题时,由于以下原因,它得到(仅有时,不是每次)HTTP 500:

NoMethodError (undefined method `[]' for nil:NilClass):
 app/models/issue.rb:159:in `create_or_update'
 app/models/issue.rb:1347:in `recalculate_attributes_for'
 app/models/issue.rb:1311:in `update_parent_attributes'
 app/models/issue.rb:173:in `destroy'
 app/controllers/issues_controller.rb:313:in `block in destroy'
 app/controllers/issues_controller.rb:311:in `each'
 app/controllers/issues_controller.rb:311:in `destroy'

这是非常令人惊讶的,因为issue.rb(问题类当然继承自ActiveRecord :: Base)是

158   def create_or_update
159     super
160   ensure
161     @status_was = nil
162   end
163   private :create_or_update

我无法在第159行看到任何[]运算符用法,也没有其他函数调用回溯,那么这怎么可能呢?我错过了关于ruby超级的一切吗?我如何进一步追踪它?

1 个答案:

答案 0 :(得分:1)

我偶然发现了答案 - NoMethodError的原因是插件名为redmine_backlogs。它会创建rb_issue_history表,其中包含一些问题的序列化历史数据(如果需要),当然history列的容量有限。我们需要保留一些重要的长期问题,并且对于他们history字段被推到了极限。这在从DB加载对象期间导致错误。

但是我仍然怀疑追溯上缺少某些东西。错误本身发生在init_history模型中的rb_issue_history.rb方法中 - 正如我所说,我在其他日志文件中偶然发现了这一点。