使用gem state_machine
每次狀態更改時如何調用方法?我讀了documentation,不知道我是否應該使用事件或狀態,以及如何實現它。state_machine gem調用方法每步更改
0
A
回答
0
事件是從一個狀態轉換到另一個狀態。比方說,你有一個汽車模型,你想實現它可以在的兩個狀態:parked
,in_motion
。
的可能轉換將是:
start
:parked => in_motion
stop
:in_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_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
上面做到了。
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
相關問題
- 1. 異步方法調用同步方法
- 2. 更改每個WCF方法的超時或調用
- 3. 如何從非異步方法異步調用異步方法
- 4. 異步調用webservice方法
- 5. 同步調用handle_asynchronously方法
- 6. C#異步方法調用
- 7. WCF調用異步方法
- 8. 同步調用redis方法
- 9. 異步方法調用
- 10. 調用方法aspx異步
- 11. 調用WCF方法異步
- 12. 異步調用方法
- 13. 異步方法調用PHP
- 14. save()方法提交異步更改?
- 15. 直接更改UITextField的調用方法
- 16. 更改變量時的調用方法
- 17. DOM更改時調用Objective C方法。
- 18. 更改調用方法的速率
- 19. Codeigniter - 在方法調用更改網址
- 20. 異步調用同步webservice方法
- 21. 同步異步調用的方法?
- 22. 異步調用異步方法
- 23. 同步調用異步方法
- 24. 在同步方法中調用異步
- 25. 從ASP.NET調用異步方法調用
- 26. 更改postdelayed方法每個入口
- 27. GWT - 調試異步方法調用
- 28. 調用異步回調中的方法
- 29. 線程調用非同步實例方法時的同步方法被調用
- 30. 同步方法調用另一個調用wait()的同步方法