CodeForMyself

SomeThingAboutCode/Cat/Murmur

Follow publication

rails常用套件 — State machines gem(AASM)狀態機

--

基本概念是:讓開過的門不能再開,有限狀態機的功能是讓你的狀態是有限的,不會只有開跟關卻突然冒出第三個選項,一次只能有一個狀態,不會在製作餐點中,突然變成已送達餐點的狀態。

在做狀態機的時候,要先想一下流程的規劃(通常使用名詞),例如:
- open(預設是公開)
- hidden (隱藏狀態)
- locked (鎖版狀態)
狀態所做的事情,就是確認你能不能變成下一個狀態,例如:公開的狀態,可以變成隱藏,也可以變成鎖版 ; 鎖版的狀態,可以變成公開但不能變成鎖版 ; 什麼狀態可以做什麼事情,是由你自己去判斷的。

如果自己手刻會發生什麼事情?那就是你要一直寫if…else因為要一直判斷現在這個狀態是打開還是關起來,就會變得很繁瑣,有了這個就會輕鬆許多,那麼就開始使用吧!

  1. 套件網址:https://github.com/aasm/aasm
  2. 我們選擇在 rails 專案使用,所到 Gemfile 裡放置gem ‘aasm’
  3. 一樣記得要bundle
  4. 接著,因為我們要改的狀態是board,所以要在boards資料表裡建立一個欄位專門放狀態,先開個migrate:
    $rails g migrate add_state_to_boards
  5. 接著到紀錄裡去增加欄位,記得 $ rails db:migrate

6. 閱讀文件裡的說明,到board的model裡把include以下複製放進去

7. 根據你需要的鎖版功能做修改,我的長這樣:(把狀態機關係想好就可以寫下面)

8. 現在可以先去 rails c - -sandbox (沙盒模式)玩玩看 !

9. 發現可以直接用終端機改掉狀態,這樣就不符合有限的遊戲規則,所以要去把這功能鎖起來 !no_direct_assignment: true

10. 這裡面也可以做一些事情( after do…. end 睡著後可以做什麼 ; error do |e| …. end 發生錯誤可以做什麼。)

11. 接下來就可以到board的view去做隱藏、鎖版跟打開的按鈕(別忘了順便到routes去設定路徑,到controller去定義action,因為之前已經有先before_action找版了,所以只要到後面追加哪些action需要做這件事情,就不用再寫在裡面)

12. 按下去發現是隱藏的,但是隱藏的字不會消失該怎麼辦?

在對應的view加上這個判斷式,如果他已經隱藏,就不要顯示,其他兩個按鈕也是相同的方式

其他的話,就是看要不要在各種狀態的按鈕下,把板名給改顏色或透明度囉!

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

CodeForMyself
CodeForMyself
Mino chen
Mino chen

No responses yet

Write a response