2015-01-14 4 views
1

Rails 4 앱에서 AASM 열이있는 ActiveRecord 모델이 있습니다. delayed_job_active_record와 함께 실패한 메서드를 사용하면 오류가 발생하여 AASM과 관련이 있습니다.AASM이있는 ActiveRecord 모델의 delayed_job - 실패한 메소드 오류가 삼키고 "잘못된 인수 수"가 대신 발생합니다

class MyModel < ActiveRecord::Base 
    include AASM 

    aasm do 
    # aasm setup here 
    end 

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

MyModel.joberrorZeroDivisionError으로 예측 실패합니다. 내가 delayed_job_active_record (MyModel.delay.joberror) 내부에서이 방법을 실행할 때, 올바른 오류가 삼킨,이 대신 발생합니다 :이 방법에도 불구하고, aasm 보석 코드를 가리키는

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' 

full stacktrace here

아아 크를 전혀 포함하지 않으며 실제 사례도 MyModel입니다. 그러나 AASM 코드를 주석 처리하면 올바른 ZeroDivision 오류로 돌아갑니다.

나는 delayed_job이 수행하고자하는 메소드의 일부 직렬화를 수행하지만 이것이 그 문제를 해결할 수있는 이유를 충분히 이해하지 못한다고 읽었습니다.

답변

1

이 지연된 작업 코드가 문제였습니다. delayed_job은 그것이 "오류"라는 이름이 경우 아무것도, 호출 할 수있는 개체에 뭔가를 보이는 오류가 발생하는 경우 : 내 경우에는

# 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 

을 나는 error라는 aasm 상태를했다. 따라서 오류가 발생할 때마다 delayed_job이 구출 된 다음이 오류 상태를 메서드로 호출하려고 시도했지만 실패했습니다. 이는 호출되는 코드가 오류를 던졌을 때와 delayed_job을 통해 실행 된 경우에만 분명히 발생했습니다.