带有ASM的ActiveRecord模型上的delay_job-吞噬失败的方法错误,而是抛出“错误数量的参数”

iftheshoefritz

在我的Rails 4应用程序中,我有一个带有AASM列的ActiveRecord模型。当我对delay_job_active_record使用失败的方法时,它会吞没错误并引发与AASM有关的其他事情。

class MyModel < ActiveRecord::Base
  include AASM

  aasm do
    # aasm setup here
  end

  def self.joberror
    1/0 #bad code here
  end
end

MyModel.joberror可以预期地以失败ZeroDivisionError但是,当我从delay_job_active_record(MyModel.delay.joberror内部运行此方法时,会吞下正确的错误,而是抛出此错误:

wrong number of arguments (2 for 0)
/Users/myhome/myproject/.gems/gems/aasm-4.0.5/lib/aasm/persistence/base.rb:67:in `block (2 levels) in state_with_scope'

完整的堆栈跟踪在这里

尽管此方法根本不涉及aasm,甚至不涉及的实际实例,但这仍指向aasm gem中的代码MyModel但是,如果我注释掉了aasm代码,它将返回到正确的ZeroDivision错误。

我读过delay_job对您要执行的方法进行了一些序列化,但是我对它的后果不甚了解,以至于不知道为什么它将导致此问题或如何解决该问题。

iftheshoefritz

这个delay_job代码就是问题所在。当delay_job遇到错误时,它将在它可以调用的对象上寻找某种东西,在这种情况下,其名称为“ error”:

# lib/delayed/backend/base.rb: 96    
rescue => e
  hook :error, e
raise e

# lib/delayed/backend/base.rb: 111
def hook(name, *args)
  if payload_object.respond_to?(name) # <--- my object has an unrelated method "error"
    method = payload_object.method(name)
    method.arity == 0 ? method.call : method.call(self, *args)
  end
rescue DeserializationError
end

就我而言,我有一个名为的aasm状态error因此,每当发生错误时,delayed_job都会获救,然后尝试将该错误状态作为方法调用,但失败了。显然,仅当被调用的代码引发错误时才发生这种情况,并且仅当它是通过delay_job运行时才发生的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章