yamazのRails日記 このページをアンテナに追加 RSSフィード

2007-02-15ARで状態管理したい(acts_as_state_machine) このエントリーを含むブックマーク

ARで状態管理したい!そんなアナタにacts_as_state_machine

http://lunchroom.lunchboxsoftware.com/articles/2006/01/21/acts-as-state-machine

http://elitists.textdriven.com/svn/plugins/acts_as_state_machine/

使用例:

http://elitists.textdriven.com/aasm-examples.rb.txt

シンプルパターン

class Machine < ActiveRecord::Base
  acts_as_state_machine :initial => :init_state_name, :column => :column_name_to_save
  state :idle
  state :running
  
  event :run do
    transitions :from => :idle, :to => :running
  end
end

最初のステートメントをinitialオプションで,セーブされるカラム名を:columnで指定します(デフォルトは'state').

state :state_nameでステートの定義(同時にstate_name?が定義される)、

event :event_nameでイベントの定義を行います(同時にevent_name!が定義される).

状態遷移前、状態から抜ける時にアクションを挟みたい

ある状態に遷移するとき,もしくはある状態から抜けるときにstateの:enter,:exitオプションアクションを挟めます.指定の仕方はProcもしくはメソッド名.

# A transition with enter and exit actions
#  +---------+               +---------+
#  |         |     run       |         |
#  | idle    |-------------->| running |
#  |         |   stop_timer  |         |
#  +---------+   do_work     +---------+
#
class Machine < ActiveRecord::Base
  acts_as_state_machine :initial => :idle
  
  state :idle
  state :running, :enter => Proc.new { |o| o.stop_timer('idle'); o.do_work() },
                  :exit  => :exit_running
  
  event :run do
    transitions :from => :idle, :to => :running
  end
  
  def stop_timer(timer)
  end
  
  def do_work
  end

  def exit_running
  end
end

状態遷移前にチェックを入れてガードしたい.

eventの:guardオプションでチェックが出来ます.下記のcan_go?はtruefalseを返すメソッド.

# Transition guards
#  +---------+               +---------+
#  |         |     run[t]    |         |
#  | idle    |-------------->| running |
#  |         |   stop_timer  |         |
#  +---------+   do_work     +---------+
#    |     ^
#    |     |
#    +_____+
#     run[f]
#
class Machine < ActiveRecord::Base
  acts_as_state_machine :initial => :idle
  
  state :idle
  state :running, :enter => Proc.new { |o| o.stop_timer('idle'); o.do_work() }
  
  event :run do
    transitions :from => :idle, :to => :running, :guard => Proc.new {|o| o.can_go? }
    transitions :from => :idle, :to => :idle
  end
  
  def stop_timer(timer)
  end
  
  def do_work
  end
  
  def can_go?
    # Returns true or false, state advances accordingly
  end
end

注意点

inhritable_attributeとして

:initial_state

:state_column

:transition_table

:event_table

を汚染します.

yamaz的日常

変な風邪をひき,あごがすごく腫れて「ナッティ プロフェッサー」みたいになっていた.

いろいろ気をつけたい.

参考画像

ShermaineShermaine2011/09/08 10:18If you want to get read, this is how you souhld write.

ctxktqmctxktqm2011/09/09 20:41w3Ia8n , [url=http://wmdaxlssqerw.com/]wmdaxlssqerw[/url], [link=http://jxlvfhbeowxb.com/]jxlvfhbeowxb[/link], http://wajddzrlilub.com/

teszmsnwteszmsnw2011/09/10 18:50Punk8H <a href="http://zrfrvlgleasc.com/">zrfrvlgleasc</a>

トラックバック - http://rubyist.g.hatena.ne.jp/yamaz/20070215