Рельсы AASM; Как сделать какое-то действие, если произошел определенный переход
Я использую конечный автомат, называемый AASM, на рельсах.
Есть событие, которое имеет два типа переходов.
Три три типа государства
state pending
state past_due
state paid
pending
может быть изменен на paid
past_due
может быть изменен на paid
event :pay do
transitions from: [:pending, :past_due], to: :paid
end
Так что здесь я хотел бы сделать некоторые действия, только если past_due
идет paid
,
Любая идея?
3 ответа
Один из способов сделать это - определить переходы в двух отдельных операторах:
event :pay do
transitions :from => :pending, :to => :paid
transitions :from => :past_due, :to => :paid, :after => do_your_custom_action
end
Подробнее о колбэках в документах.
Вы можете прикрепить after
обратный вызов для перехода и события.
Так как событие одинаково для обоих переходов, вы должны прикрепить обратный вызов к определенному переходу из past_due
в paid
,
Поскольку вы охватываете оба потока за один переход, первым шагом будет сделать отдельный переход для этого потока и прикрепить к нему обратный вызов. Как,
transitions :from => :past_due, :to => :paid, :after => your_required_action
Лично я передаю блок after
Перезвоните
event :pay do
after do
# do_something
end
transitions from: [:pending, :past_due], to: :paid
end
Таким образом, я гарантирую, что do_something
будет выполнен после event :pay
законченный.
Другой способ - прикрепить обратный вызов к transitions
где обратный вызов будет выполнен после завершения переходов.
Пожалуйста, ознакомьтесь с документами и прочитайте о колбэках и порядке их звонков, чтобы удовлетворить ваши потребности.