Ruby AASM (действует как конечный автомат): обработка платежа: объединение до обратного вызова с защитником - PullRequest
0 голосов
/ 12 июня 2018

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

...