2017-02-22 2 views
0

Я использую драгоценный камень государственного устройства под названием AASM на рельсах.Rails 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.

Любая идея?

ответ

1

Один из способов сделать это, чтобы определить переходы в двух отдельных отчетах:

event :pay do 
    transitions :from => :pending, :to => :paid 
    transitions :from => :past_due, :to => :paid, :after => do_your_custom_action 
end 

Подробнее о обратных вызовов in the docs.

0

Вы можете подключить обратный вызов after как к переходу, так и к событию.

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

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

transitions :from => :past_due, :to => :paid, :after => your_required_action 
0

Лично я передать блок в after обратного вызова

event :pay do 
    after do 
    # do_something 
    end 
    transitions from: [:pending, :past_due], to: :paid 
end 

Таким образом, я гарантировать, что do_something будет выполняться после того, как event :pay закончена.

Другой способ - подключить обратный вызов к transitions, где обратный вызов будет выполнен после завершения переходов.

Пожалуйста, ознакомьтесь с документами и read about callbacks и его порядком вызова для ваших нужд