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