我想知道设置它的最佳方法是什么。将state_machine gem用于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,它会转到:second,否则它会失败,进入下一个转换,它保持相同的状态。假设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
,因为我需要它有条件地移动到下一个转换,如果外部呼叫失败。
有什么建议吗?