2010-12-31 6 views
2

うまくいけば、これは愚かな質問ではなく、私はRuby/Rails状態マシン(AASM、Transitions、AlterEgoなど)で何かを見落としていないことを願っています。状態が変化したときにイベント遷移を実行するRuby/Rails状態マシンは存在しますか?

これらのステートマシンの実装は、イベントが発生し、そのイベントの適切な遷移が古い状態と新しい状態に基づいてトリガされるという序文で動作します。しかし、彼らは他の方法で動作するようには思われません。現在の状態を新しい状態に遷移させるイベントを発生させるのではなく、「作成済み」から「割り当て済み」に状態を変更して正しい遷移を起こさせたいとします。

基本的には、ユーザーは選択可能な状態の選択ボックスから新しい状態を選択し、適切な遷移、ガード、成功コールバックなどを実行できるようにしたいと考えています。

既存のステートマシンの実装がこれをサポートしているかどうかは知りませんか?

答えて

0

あなたは私のgem flojoで何をしようとしていますか? 状態の後にイベントの名前を付け、それらのイベントがワイルドカード状態からドロップダウンで選択された状態に遷移するようにするだけです。あなたがダウンあなたのドロップで「保留」状態を持っている場合は

することは、あなたがフォームを送信すると、あなたはそれからで「保留」を接頭しなければならない次のスニペット

event :pending do 
    # :any is a wildcard state and is only valid as a begin state. 
    transition :any, :pending 
end 

を使用してflojoイベントを設定することができます"wf_"をシンボルに変換してオブジェクトに送ります。接頭辞とシンボルの変換を行い、送信するように委譲するメソッドをクラス内に作成するだけで、よりクリーンな方法です。

your_object.send :wf_pending 

https://github.com/alternegro/flojo

2

ステートマシンは、性質上、システム内の任意の状態に任意にジャンプすることを許可していません。それぞれにエントリーポイントがあり、状態を変更するたびにいくつかの条件が評価されます(そのうちの1つは入力イベントです)。次の状態はそれらの条件の結果です。ただし、各状態から別の状態に遷移が定義された状態マシンを使用することもできます。

class Ticket 
    acts_as_state_machine :initial => :new 

    state :new 
    state :open 
    state :resolved 

    event :open do 
    transitions :to => :open, 
     :from => [:new, :resolved], :guard => :can_be_open? 
    end 

    event :new do 
    transitions :to => :new, 
     :from => [:open, :resolved], :guard => :can_be_new? 
    end 

    event :resolved do 
    transitions :to => :resolved, 
     :from => [:open, :new], :guard => :can_be_resolved? 
    end 

    private 

    def can_be_resolved? 
    !resolution.blank? 
    end 

    ... 

end 

@ticket = Ticket.create 
@ticket.state # => new 
@ticket.resolved! 
@ticket.state # => resolved 

したがって、ドロップダウンから目的の状態を確認し、結果として適切な移行を呼び出す必要があります。 attr_accessor :new_stateのような単純なものを使用してから、モデルがbefore_validationを呼び出すnew_state => eventマッピングまたはcase文を使用できます。

+0

[OK]を、ので、私はここに奪うためのキーポイントは、選択ボックスの値は、状態名にすることができ、モデル#」で使用することができるような状態名と一致するイベント名があることができていると思いますイベントをトリガーするために '送信'します。右? – Bryan

関連する問題