2015-02-09 28 views
1

我用一些自定义脚本管理Redmine(2.3.2.stable.231,rails 3.2.13),它用得很好。最近然而,当我的脚本试图通过管理平台API破坏的问题,它会因为(只是偶尔,不是每次)HTTP 500:“undefined方法`[]'为零:NilClass”而超级

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的::基地)是

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

我看不到线159任意[]操作符的使用,无论是在回溯另一个函数调用,所以这怎么可能?我错过了关于红宝石的超级?我如何进一步追踪它?

+0

'super'会在'Issue'的父类上调用'create_or_update'方法(? - 我猜这是'Issue'类) – mudasobwa 2015-02-09 10:57:49

+0

会吗?追踪上没有关于它的信息。无论如何,我检查了它,并且ActiveRecord :: Base似乎不使用[]运算符[link](http://apidock.com/rails/ActiveRecord/Base/create_or_update) – fernando 2015-02-09 11:06:04

+0

Racing condition?我猜想当它到达** super **行时,实例本身已经消失。这是一个多线程的事情吗? – froderik 2015-02-09 13:36:20

回答

1

我意外地发现了答案 - NoMethodError的原因是名为redmine_backlogs的插件。它创建了rb_issue_history表,其中包含一些序列化的历史数据(如果需要),当然history列的容量有限。我们需要保留一些重要的长期问题,并且让他们的领域变得极其有限。从DB加载对象时导致错误。

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

相关问题