使用gem state_machine
每次状态更改时如何调用方法?我读过documentation并且不知道我是否应该使用事件或状态,以及如何实现它。
答案 0 :(得分:0)
事件是从一个州到另一个州的过渡。假设您有一个Car模型,并且您希望实现它可以位于的两个状态:parked
,in_motion
。
可能的转变是:
start
:parked => in_motion
stop
:in_motion => parked
让我们说,在start
转换之前,您需要执行一个名为fasten_seatbelt
的方法,并在stop
:方法stop_engine
之后执行。
在这种情况下,您应该将这些方法定义为回调,如下所示:
class Car
...
state_machine :state, :initial => :parked do
before_transition :on => :start, :do => :fasten_seatbelt
after_transition :on => :stop, :do => :stop_engine
event :start do
transition :parked => :in_motion
end
event :stop do
transition :in_motion => :parked
end
end
...
private
def fasten_seatbelt
...
end
def stop_engine
...
end
end
现在,当汽车处于parked
状态时:
car.state #=> parked
您可以在其上调用start
方法,就像:
car.start
首先调用fasten_seatbelt
方法,然后将汽车状态更改为in_motion
(before_transition
回调操作start
已定义。
当汽车为in_motion
并且您致电car.stop
时,它会首先将状态更改为parked
,然后调用stop_engine
方法(after_transition
回调电话)
现在,如果我理解正确,您希望在每次状态更改后调用相同的方法。如果是这种情况,那么您应该按以下方式定义回调:
after_transition :on => any, :do => :your_method
为您的课程定义your_method
,就像我使用fasten_seatbelt
&上例中的stop_engine
。
答案 1 :(得分:0)
其他answer非常详尽,但我只想在列表中添加一些选项。这些是等价的:
state_machine do
after_transition :your_method # the most simple
after_transition any => any, :do => :your_method # state based
after_transition :on => any, :do => :your_method # event based
# ...
end
def your_method
# ...
end