什麼是狀態機?
狀態機也可以稱作有限狀態機,是表示在有限制的狀態以及在這些狀態之間的轉移和動作等行為。
為什麼要使用狀態機去設計狀態?
即使不使用狀態機,也是可以直接寫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 ...


沒有留言:
張貼留言