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

0 ответов

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