什麼是狀態機?
狀態機也可以稱作有限狀態機,是表示在有限制的狀態以及在這些狀態之間的轉移和動作等行為。
為什麼要使用狀態機去設計狀態?
即使不使用狀態機,也是可以直接寫code達到所需要的效果,只是當狀態數量多的情況下有可能會產生錯誤,狀態機則會將各種狀態(State)整理好,透過事件(Event)描述狀態之間的過渡(Transition)方式,讓處理狀態流程時可以輕鬆應對。
如何在 Rails 內設計狀態機機制?
我採用aasm來設計狀態機,aasm的安裝相當簡易,直接在Gemfile中寫入
gem "aasm"
在要建立狀態的Model中新增狀態欄位,aasm預設的欄位名稱為aasm_state,如果要改用其他的名稱,則需要特別指定。假設要實作的狀態流程如下:
在Model中建立aasm狀態機
在controller#action中呼叫event就可以變更狀態
include AASM aasm do #這裡aasm會預設欄位為aasm_state,若名稱不一樣時可以改寫成aasm :column => "你的欄位名" do #建立狀態 state :sA, initial: true #sA為初始化狀態 state :sB state :sC state :sD #建立事件 event :E1 [, after_commit: 其他action] do #在"其他action"執行後在進行狀態轉換 transitions from: :sA, to: :sB end event :E2 do transitions from: :sB, to: :sC end event :E3 do transitions from: :sB, to: :sD end event :E4 do transitions from: :sD, to: :sA end end
在controller#action中呼叫event就可以變更狀態
... @order = Order.find(params[:id]) @order.E1! #把狀態從sA切換到sB ...
沒有留言:
張貼留言