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の変更を避けたいので、将来アップグレードする必要がある場合でも安全です。