2015-12-02 83 views
0

我們在Rails應用中使用Geekq/workflow。這裏有一個例子:如何查找工作流中是否觸發了事件?

class Article 
    include Workflow 
    workflow do 
    state :new do 
     event :submit, :transitions_to => :awaiting_review 
    end 
    state :awaiting_review do 
     event :review, :transitions_to => :being_reviewed 
    end 
    state :being_reviewed do 
     event :accept, :transitions_to => :accepted 
     event :reject, :transitions_to => :rejected 
    end 
    state :accepted 
    state :rejected 
    end 
end 

這是很容易找到,如果一個狀態,例如,:awaiting_review已經經歷了:

article.current_state < :awaiting_review 

然而,我們沒有發現檢查的方法事件已被解僱。正在檢查一個事件是否被工作流的內置方法激發了一些可能的東西?或者如果沒有這個工作流程,其他任何可以?

+0

什麼操作你想要在事件發生時執行?在轉換到另一個狀態之前,您可以使用'before_transition'來執行操作。希望這會有所幫助。 –

+0

只需檢查一個事件是否爲一個實例觸發。沒有對事件進行操作。 – user938363

+0

然後你可以使用before_transition。每當發生任何事件時,都會調用轉換,並在轉換之前記錄它。 –

回答

0

所以,你可以捕捉on_create的事件和on_update,因爲存在於它的回調在ActiveRecord的,但在工作流程change_state,你需要重寫工作流程的轉變,由:

class Article < BaseModel 

include Workflow 
    workflow do 
    state :new do 
     event :submit, :transitions_to => :awaiting_review 
    end 
    state :awaiting_review do 
     event :review, :transitions_to => :being_reviewed 
    end 
    state :being_reviewed do 
     event :accept, :transitions_to => :accepted 
     event :reject, :transitions_to => :rejected 
    end 
    state :accepted 
    state :rejected 

    on_transition do |from, to, event, *event_args| 
     self.update_attribute(:status, to) 
     # this triggers on_update callback on workflow transition 
     # which you can use to log the event now 
    end 
    end 
end 

class BaseModel < ActiveRecord 
    after_commit :log_create_event, on: [:create] 
    after_commit :log_update_event, on: [:update] 
    after_commit :log_destroy_event, on: [:destroy] 

    def log_create_event 
    #log_event('Create') 
    end 

    def log_update_event 
    #log_event('Update') 
    end 

    def log_destroy_event 
    #log_event('Destroy') 
    end 
end