state_machine gem调用方法每步更改

时间:2013-12-11 23:35:22

标签: ruby-on-rails ruby state-machine

使用gem state_machine每次状态更改时如何调用方法?我读过documentation并且不知道我是否应该使用事件或状态,以及如何实现它。

2 个答案:

答案 0 :(得分:0)

事件是从一个州到另一个州的过渡。假设您有一个Car模型,并且您希望实现它可以位于的两个状态:parkedin_motion

可能的转变是:

startparked => in_motion

stopin_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_motionbefore_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