acts_as_state_machine

2008年04月10日 21:38
トラックバック (0)   コメント (0)
restful_authenticationのジェネレータには、「--stateful」というオプションがあって、acts_as_state_machineというプラグインを使ったユーザの状態管理をサポートしています。

./script/generate authenticated user sessions --stateful

これをやると、アクティベーションの部分も一緒に入りますので、出来上がるものは以下と全く同じ。

./script/generate authenticated user sessions \
              --include-activation \
              --stateful

acts_as_state_machineはインストールされませんので、別途インストール

$ script/plugin install http://elitists.textdriven.com/svn/plugins/acts_as_state_machine/trunk/

ジェネレートした後でuser.rbを見てみると、いつものに加えてacts_as_state_machine用の記述がいくつかある

acts_as_state_machine :initial => :pending
  state :passive
  state :pending, :enter => :make_activation_code
  state :active,  :enter => :do_activate
  state :suspended
  state :deleted, :enter => :do_delete

  event :register do
    transitions :from => :passive, :to => :pending, :guard => Proc.new {|u| !(u.crypted_password.blank? && u.password.blank?) }
  end
  
  event :activate do
    transitions :from => :pending, :to => :active 
  end
  
  event :suspend do
    transitions :from => [:passive, :pending, :active], :to => :suspended
  end
  
  event :delete do
    transitions :from => [:passive, :pending, :active, :suspended], :to => :deleted
  end

  event :unsuspend do
    transitions :from => :suspended, :to => :active,  :guard => Proc.new {|u| !u.activated_at.blank? }
    transitions :from => :suspended, :to => :pending, :guard => Proc.new {|u| !u.activation_code.blank? }
    transitions :from => :suspended, :to => :passive
  end


最初のacts_as_state_machineではデフォルトの状態を設定。
stateで状態の種類、eventで状態遷移のメソッド(実際に呼ぶ時はけつに!をつける)を定義しています。

DBでのデフォルトはpassiveで、acts_as_state_machineで指定してるのはpending
基本的には保存前がpassiveで、保存時に自動でpendingになる。
状態が他の状態からかわる時、:enterで指定されたメソッドが実行されるので、ここではmake_activation_codeというメソッドが実行されます。

この時event :registerが定義されていますので、saveじゃなくてregister!メソッドでも同じ動作はするんですが、eventで定義したメソッドはバリデーションがかかりません。なので、必要なデータが入ってなくても普通に保存できてしまうのが難点。:guardを設定することで、パスワードが入っていない時はpendingにはならないようになっているけど、保存自体はされるのでpassiveのままレコードが出来てしまう。こんなのゴミデータ以外のなにものでもない
なので思い切ってevent :register do~endは削っちゃいましょう。unsuspendのところが微妙におかしくなるけど、ここもあわせて書き換えておけば安心です。

acts_as_state_machineはなかなか面白いプラグインなんですが、usersテーブルにactivation_codeが入るのがいやなので、実際に使ってる時は原型をとどめないくらいに作り直しちゃってます。

2007-02-15ARで状態管理したい(acts_as_state_machine)を参考にさせていただきました。

押忍
最新エントリー
カテゴリ
月別のアーカイブ
プロフィール
吉見和也(Kazuya Yoshimi)
RAWHIDE.(ローハイド.)取締役兼最高技術責任者。Rubyで開発する心地よさに惚れ、Ruby道を邁進する日々。迷わず行けよ、行けばわかるさ、Ruby道。押忍!
Powered by
 
プレスリリース Feed

企画特集

Webセキュリティ特集Webセキュリティ特集
Web2.0時代の脅威へ対抗するためのソリューションとは?
セキュリティ対策レベルテスト公開!セキュリティ対策レベルテスト公開!
自社のセキュリティのウイークポイントはドコ?
「シンプル」&「低コスト」な運用管理「シンプル」&「低コスト」な運用管理
IT運用管理に関するアンケート実施中!
APC SOLUTIONS FORUM 2008をレポートAPC SOLUTIONS FORUM 2008をレポート
電源、冷却の効率化によるエネルギー削減とは?
Techno ExchangeTechno Exchange
RackableとCTCの地球にやさしい関係
サーバ仮想化・グリーン化の利点を最大化!サーバ仮想化・グリーン化の利点を最大化!
そ多機能・高価値なNetAppストレージの秘密とは
ZDNet Japan ホスティング特集ZDNet Japan ホスティング特集
2008年夏のホスティングサービスのトレンドは何?
ZDNet Japan Green ITZDNet Japan Green IT
サミットだけでは終わらせない!エンタープライズの取り組みはこれからだ!
ログ管理ソリューション特集ログ管理ソリューション特集
セキュリティ、コンプライアンス対策で注目度アップ!
フォトレポート:注目の「iPhone 3G」アプリトップ10
「iPhone 3G」発売から時間がたち、App Storeが充実してきた。ここでは、注目のアプリケーション10種を紹介する。
フォトレポート:コスプレーヤー、コミックの祭典に集合--Comic-Con 2008
Comic-Con 2008が7月にサンディエゴで開催された。このコミックの祭典とも言えるイベントで見つけたコスプレーヤーたちを画像で紹介する。
フォトレポート:絵で見る「Internet Explorer 8」ベータ2
マイクロソフトがこのほど、「Internet Explorer 8(IE8)」のベータ2をリリースした。このリリースにおける特長はユーザー志向の機能だ。