2009-11-30 10 views
1

Existe-t-il un moyen agréable de dire à AASM que si une exception est levée lors du traitement d'un assm_event, je veux que cette erreur soit détectée par un bloc de code spécifique?Puis-je demander à AASM d'exécuter une méthode spécifique en cas d'échec de l'événement?

par exemple, actuellement je fais quelque chose comme

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 

et ce que je préférerais faire quelque chose comme

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 

et ont log_failure être appelé si something_that_might_raise_exception soulève une exception. Idéalement, je veux éviter de changer AASM Je suis si sûr si je dois lui mettre à jour à l'avenir

Répondre

0

Si vous utilisez SimpleStateMachine vous pouvez faire:

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