2016年7月4日 星期一

使用aasm來完成狀態機

什麼是狀態機?

狀態機也可以稱作有限狀態機,是表示在有限制的狀態以及在這些狀態之間的轉移和動作等行為。


為什麼要使用狀態機去設計狀態?


即使不使用狀態機,也是可以直接寫code達到所需要的效果,只是當狀態數量多的情況下有可能會產生錯誤,狀態機則會將各種狀態(State)整理好,透過事件(Event)描述狀態之間的過渡(Transition)方式,讓處理狀態流程時可以輕鬆應對。

如何在 Rails 內設計狀態機機制?


我採用aasm來設計狀態機,aasm的安裝相當簡易,直接在Gemfile中寫入

gem "aasm"

在要建立狀態的Model中新增狀態欄位,aasm預設的欄位名稱為aasm_state,如果要改用其他的名稱,則需要特別指定。假設要實作的狀態流程如下:

在Model中建立aasm狀態機
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
...

沒有留言: