1

state_machine に依存してさまざまな状態を管理するモデルがあります。特定のイベントでは、遷移を行う前に結合テーブルを作成する必要があるため、before_transition が必要です。残念ながら、うまくいきません。

class DocumentSet < ActiveRecord::Base

  state_machine :state, :initial => :draft do
    # Callbacks
    before_transition :on=>:submit, :do=>:populate_join_table

    # States
    state :draft
    state :submitted

    # Events
    event :submit do transition :draft=>:submitted, :if=>:can_submit? end
  end

def populate_join_table
   puts '::::::::: INSIDE POPULATE_JOIN_TABLE'
end

def can_submit?    
  raise "Document Set has no Document(s)" if self.document_versions.blank?
  true
end

DocumentSet.submit を実行すると、can_submit を評価するため、実際には populate_join_table には入りませんか? 偽として。

私は何が欠けていますか?

4

2 に答える 2

3

私が解決策を見つけたと思います。基本的に何が起こるかというと、state_machineは最初に:if条件を評価し、次にbefore_transitionを評価します。

したがって、順序は次のとおりです。

If (GuardCondition == true)
  run before_transition
  run transition
  run before_transition
于 2010-02-22T09:23:28.757 に答える
1

ガード条件は、そのイベント (および遷移) がその時点で有効かどうかを制御します。この場合、ガードは false を返すため、遷移しません。これは非常に便利ですが、あなたのケースでは、そのコールバックを実行できるようにするために、やり直し/再考が必要になる場合があります。

于 2010-02-22T17:39:54.300 に答える