1

我有一个依赖 state_machine 来管理其不同状态的模型。一个特定事件需要 before_transition,因为它需要构建一个连接表 fore 来进行转换。不幸的是,它不起作用。

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 时,它实际上从未进入 populate_join_table,因为它评估了 can_submit?作为假。

我错过了什么?

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 回答