2009-11-30 2 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 

и имеют log_failure быть вызван, если something_that_might_raise_exception действительно вызывает исключение. В идеале я хочу, чтобы избежать изменения 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 

 Смежные вопросы

  • Нет связанных вопросов^_^