Рельсы AASM; Как сделать какое-то действие, если произошел определенный переход

Я использую конечный автомат, называемый AASM, на рельсах.

Есть событие, которое имеет два типа переходов.

Три три типа государства

state pending
state past_due
state paid

pending может быть изменен на paidpast_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 где обратный вызов будет выполнен после завершения переходов.

Пожалуйста, ознакомьтесь с документами и прочитайте о колбэках и порядке их звонков, чтобы удовлетворить ваши потребности.

Другие вопросы по тегам