1

RubyonRailsアプリケーションがあります。

オブジェクトの状態を管理するためにRubyのaasmgemを使用しています。

has_state
aasm do
    state :created, :initial => true
    state :submitted
    state :rejected
    state :approved

    event :submit do
        transitions :to => :submitted, :from => [:created]
    end

    event :mark_as_incomplete do
        transitions :to => :created, :from => [:submitted]
    end

    event :approve do
        transitions :to => :approved, :from => [:submitted]
    end

    event :reject do
        transitions :to => :rejected, :from => [:submitted]
    end
end

オブジェクトの現在の状態がわかっている場合は、

object.aasm_current_state

また、遷移する状態もわかっていますが、どのようにイベントを呼び出すことができますか?

from-stateとto-stateは変数であるため、上記を動的に行う必要があることに注意してください。もちろん、特定の状態への組み合わせと状態からの組み合わせでは、遷移は使用できません。その場合、エラーを検出する必要があります。

また、任意の2つの状態の組み合わせ(to-stateとfrom-state)の間で、イベントは1つだけであると想定しています。理論的には、1つ以上存在する可能性があると思います。

これは、aasmソースコードの内部を掘り下げることで達成できると思いますが、これはおそらく良い習慣ではないかもしれません。何かご意見は?

誰かが以前にこれをしたことがあるかどうかだけ疑問に思います。

ありがとう!

4

2 に答える 2

2

これを行う方法はAASMによって提供されていませんが、あなた自身の答えは、あなたが行きたい場所にすでに十分近づいています. AASM は、ステート マシンが 1 つの状態から別の状態への複数の異なる遷移を許可するという仮定に基づいて構築されています。

イベント名が関係ない場合は、次のように to-state 名をイベント名として再利用できます。

aasm do
  ...
  event :approved do
    transitions :from => :submitted, :to => :approved
  end
  ...
end

これにより、to-state 名を知るだけでイベントを発生させることができます

approval_request.send(to_state)

デフォルトでは、この移行が許可されていない場合、AASM は例外を発生させます。例外が気に入らない場合は、次のように に設定whiny_transitionsfalseます。

aasm :whiny_transitions => false do
   ...
end
于 2012-11-06T08:05:38.873 に答える
0

これは私が持っているコードです。to_state と from_state は、from と to の状態です。

ApprovalRequest.aasm_events.each do |event_key, event_obj|
    if event_obj.transitions_from_state?(from_state) &&
        event_obj.transitions_to_state?(to_state)
        self.approval_request.send "#{event_key.to_s}!"
    end
end

この実装について何かコメントはありますか?

于 2012-11-05T18:05:59.483 に答える