Давайте предположим очень простой класс Payment
, подобный следующему:
class Payment
include AASM
aasm do
state :created
state :paid
state :refunded
event :pay do
transitions from :created, to :paid
end
end
end
Таким образом, можно вызвать payment.pay
, чтобы инициировать платеж, совершая соответствующие вызовы API.
Очень важно, чтобы переход с created
на paid
происходил только в случае успешной оплаты.
1) Я бы предположил, что вызовы API должны быть помещены в обратный вызов before
в событии :pay
, но это не остановит переход, если вызов API был неудачным (давайте предположим, что вызов API делаетНЕ вызывает исключение, оно просто возвращает статус).
2) Затем я подумал, что мне следует объединить обратный вызов before
с охранником;используйте обратный вызов before
для вызова API и установите его результат в модели (например, используя attr_accessor
).Тогда охранник разрешит ему перейти из состояния created
в paid
только в случае успешной оплаты.
Является ли это идиоматическим способом обработки такого перехода событий в конечном автомате с помощью aasm?Я прочитал все вопросы переполнения стека, помеченные aasm
, и документацию по гему, и у меня все еще остаются вопросы о том, как лучше всего сделать эти безопасные переходы.