before_filter无法在state_machine中工作:(

时间:2010-02-18 22:09:43

标签: ruby-on-rails ruby state-machine

我有一个依赖于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时,它实际上从未进入populate_join_table,因为它评估了can_submit?为假。

我错过了什么?

2 个答案:

答案 0 :(得分:3)

想想我找到了解决方案。基本上发生的是state_machine首先评估:if条件,然后才进行before_transition。

所以顺序是:

If (GuardCondition == true)
  run before_transition
  run transition
  run before_transition

答案 1 :(得分:1)

保护条件控制该事件(和转换)在那时是否有效。在这种情况下,你的守卫返回false,所以你不会转换。这可能非常有用,但在您的情况下,您可能需要重新设计/重新思考以使回调运行。