2013-12-11 59 views

回答

0

事件是從一個狀態轉換到另一個狀態。比方說,你有一個汽車模型,你想實現它可以在的兩個狀態:parked,in_motion

的可能轉換將是:

startparked => in_motion

stopin_motion => parked

而且,我們說,你想之前start過渡到執行和stop後,有的叫fasten_seatbelt方法:方法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上面做到了。

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