Условный переход state_machine с внешним вызовом API

Мне интересно, как лучше это настроить. Использование гема state_machine для ruby.

По сути, у меня есть переход конечного автомата, который зависит от внешнего вызова API. Что-то вроде:

state_machine initial: :start do
  event :move do
    transition :start => :second, if: :external_is_cool_with_it?
    transition :start => same
  end
end

Это работает довольно хорошо, как будто внешний API возвращает true, он переходит к: секунда, в противном случае он не работает, переходит к следующему переходу, который остается в том же состоянии. Допустим, вызов API отправляет электронное письмо.

Единственная проблема, я не могу спросить:

instance.can_move?

Потому что это на самом деле запустить if, который вызывает внешний API и т.д... поэтому, когда я делаю что-то вроде:

instance.move! if instance.can_move?

или же

if instance.can_move?
  puts "Moveable"
  # Form to allow state_event
end

Это вызвало бы внешний API дважды (отправьте письмо дважды).

Так что я не думаю, что использование if правильно в этом случае, но я также не могу использовать before/after_transition так как мне нужно условно перейти к следующему переходу в случае сбоя внешнего вызова.

Какие-либо предложения?

0 ответов

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