Liz's Blog

17道上課筆記#8:為何我們要用狀態機去設計訂單狀態?

| Comments

什麼是狀態機?

用來設計比較複雜流程的model,如AASM - Ruby state machines,AASM本來一開始只是作為狀態機,經過演化後,目前不再只針對ActiveRecord,還提供ActiveRecord和Mongoid的adapter,以及可用在任何Ruby class。

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

用人工去制訂訂單狀態(如下)也是可行的,只是非常耗時且非常可能出錯,使用狀態機可以減少非常多的麻煩。

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

已下訂→已付款→出貨中→到貨
↘ ↙ ↓
取消訂單 退貨

include AASM

  aasm do
    state :order_placed, initial: true #狀態:已下訂

    state :paid                        #狀態:已付款

    state :shipping                    #狀態:出貨中

    state :shipped                     #狀態:到貨

    state :order_cancelled             #狀態:取消訂單

    state :good_returned               #狀態:退貨



    event :make_payment do             #已下訂→付款後→轉成已付款

      transitions from: :order_placed, to: :paid
    end

    event :ship do                     #已付款→出貨→轉成出貨中

      transitions from: :paid,         to: :shipping
    end

    event :deliver do                  #出貨中→運送中→轉成已到貨

      transitions from: :shipping,     to: :shipped
    end

    event :return_good do              #已到貨→欲退貨→完成退貨

      transitions from: :shipped,      to: :good_returned
    end

    event :cancell_order do            #已下訂→欲取消訂單→完成取消訂單            

      transitions from: [:order_placed, :paid], to: :order_cancelled
    end
  end

【17道上課筆記系列】

  1. 17道上課筆記#1:整理撰寫 SEO 原則
  2. 17道上課筆記#2:User Story
  3. 17道上課筆記#3:列出五條 Yahoo Frontend Best Performance 最佳實務
  4. 17道上課筆記#4:Strong Parameter
  5. 17道上課筆記#5:如何讓 strong_parameter 接受 nested_attributes
  6. 17道上課筆記#6:before_action 的使用時機
  7. 17道上課筆記#7:session 與 cookie 的差別
  8. 17道上課筆記#8:為何我們要用狀態機去設計訂單狀態?
  9. 17道上課筆記#9:has_one v.s. has_many
  10. 17道上課筆記#10:render 與 redirect_to 的差異
  11. 17道上課筆記#11:routing 的 namespace
  12. 17道上課筆記#12:Callbacks
  13. 17道上課筆記#13:Service Object
  14. 17道上課筆記#14:Inheritance繼承
  15. 17道上課筆記#15:為什麼 Rails 要分production、test、development三種環境
  16. 17道上課筆記#16:什麼時機要用 helper?什麼時機要用 partial?

Comments

comments powered by Disqus