2009-11-30 22 views
1

有沒有一種很好的方法可以告訴AASM,如果在處理任何assm_event時引發異常,我想讓這個錯誤被特定的代碼塊捕獲?我可以讓AASM在事件失敗時運行特定的方法嗎?

如目前我做這樣的事情

assm_state :state_1 
assm_state :state_2, :before_enter => :validate_something 
assm_state :failed 


assm_event :something_risky do 
    transition :from => :state_1, :to => :state_2 
end 

assm_event :fail do 
    transition :from => [:state_1, :state_2], :to => :failed 
end 

def validate_something 
    begin 
    something_that_might_raise_error 
    rescue 
    self.record_error 
    self.fail 
    end 
end 

什麼,我寧願做是一樣的東西

assm_state :state_1 
assm_state :state_2, :before_enter => :validate_something 
assm_state :failed 


assm_event :something_risky, :on_exception => :log_failure do 
    transition :from => :state_1, :to => :state_2 
end 

assm_event :fail do 
    transition :from => [:state_1, :state_2], :to => :failed 
end 

def validate_something 
    something_that_might_raise_exception 
end 

def log_failure 
    self.record_error 
    self.fail 
end 

,並有如果something_that_might_raise_exception確實提出了一個異常log_failure被調用。理想的情況是我想避免更改AASM所以我很安全的,如果我需要如果你使用它的升級在未來

回答

0

SimpleStateMachine你可以這樣做:

def something_risky 
    something_that_might_raise_error 
    rescue 
    record_error 
    raise #reraise the error 
    end 
    event :something_risky, :state1 => :state2, 
          RuntimeError => :failed 
相關問題