Ruby AASM (действует как конечный автомат): обработка платежа: объединение до обратного вызова с охранником
Давайте предположим, что очень просто 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
и документация по драгоценным камням, и у них все еще есть вопросы о том, как лучше сделать эти безопасные переходы