我有一个状态机,具有三种可能的状态:state1、state2、state3。
每当一个对象进入state_3时,我想触发一个事件event1。
在我的状态机中,我有
after_transition :on => :state_3, :do => :event1.
但是每当状态从state1变为state3或state2变为state3时,事件就会被正确触发。但是当状态转换是从state3到state3时,event1不会被触发。我怎样才能实现这个目标?
我知道 state3 到 state3 不是 state_transition。我可以使用 after_save 回调之类的东西并检查状态是否为 state3。但我想知道在state_machine中是否有有效的方法来实现这一点?
我之所以要触发state3上的事件到state3是因为,我有一个表单。仅当所有问题都得到解答时,表单才会到达状态 3。回答完所有问题后,我正在计算分数。如果用户只是更改答案怎么办?状态只会从 state3 更新到 state3。这就是我想触发从state3到state3的事件的情况。
当用户更改答案时,他们会重新运行状态 2 到 3 的转换。因此,在应用更改之前将状态更改为 state2。
或者,创建一个更新状态并在应用更改之前将问题放入该状态。
自转换(目标状态与源状态相同的转换)可以在 state_machines gem 中编码,如下所示:
event :event1
transition :state3 => :state3
end
after_transition on: :event1 do |myobject, transition|
myobject.foobar
end