酒と泪とRubyとRailsと

Ruby on Rails と Objective-C は酒の肴です!

Railsで可読性の高いステート・マシンを実現できるGem State_machine

Ruby/Rails内でステート・マシンを実現してくれるGem、『state_machine』の紹介です。model内に直感的なコードを書くことができ、かつメンテナンスもしっかり行われているので、オススメです!


Gemのインストール

Gemfileに以下を追加して、コンソールでbundleを実行してください。

1
2
# 状態遷移の管理
gem "state_machine"

使い方

まず、モデルの指定したカラムを使って状態を記録します。ここでは、カラムrunner_stateが、状態『stand, walk, run』の3つの状態を持つとします。

1
2
3
4
5
6
7
8
9
10
11
12
13
class Human < ActiveRecord::Base
 state_machine :runner_state, :initial => :stand do
    state :stand
    state :walk
    state :run

    event :change_pace do
      transition :to => :walk,  :from => [:stand]
      transition :to => :run,   :from => [:walk]
      transition :to => :stand, :from => [:run]
    end
  end
end

これで定義は完了です。基本的な使い方は下記。

インスタンス.event名! => イベントの発生
インスタンス.state名? => 状態の確認
1
2
3
4
5
6
7
8
9
10
11
12
human = Human.create
#=> #<Human id: nil, state: "red", created_at: nil, updated_at: nil> 

# humanの状態がstandか?
human.stand? #=> true

# runner_stateを変更
human.change_pace #=> walk

# humanの状態がwalkか?
human.stand? #=> false
human.walk? #=> true

state_machine Usage』には詳しい使い方が書かれています。

公式サイト

最後に公式のGitHubの紹介です。

pluginaweek/state_machine · GitHub

Special Thanks

Rubyで使えるstate_machineなるものを知る - smajimaの日記

おすすめの書籍