2010-02-18 131 views
1

我有一個模型依賴於state_machine來管理其不同的狀態,一個特定的事件需要一個before_transition,因爲它需要在轉換前建立一個連接表,不幸的是它不起作用。before_filter not working in state_machine :(

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。

我缺少什麼?

回答

3

想我找到了解決方案。基本上w發生的情況是,state_machine首先評估:if條件,然後才執行before_transition。

這樣的順序是:

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

防護條件(S)控制的事件(和過渡)是否是當時有效的。在這種情況下,你的警衛返回假,所以你不會過渡。這可能是非常有用的,但就你而言,你可能需要重做/重新考慮讓回調運行。