2009-11-30 3 views
1

assm_event를 처리하는 동안 예외가 발생하면 해당 코드 블록이 해당 오류를 포착하도록 AASM에 알리는 좋은 방법이 있습니까?이벤트 실패시 AASM이 특정 메소드를 실행하도록 할 수 있습니까?

는 예를 들어, 현재 나는 내가 무엇을 선호하는

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 

같은입니다

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 

과 같은 일을하고 something_that_might_raise_exception는 예외를 발생 않는 경우 log_failure를 호출 할 수 있습니다. 이상적으로 나는 당신이 사용하는 경우 미래 ​​

답변

0

에 업그레이드해야하는 경우 그래서 안전하다 AASM을 변경하는 것을 방지 할 SimpleStateMachine 당신은 할 수 있습니다 :

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