2014-02-10 30 views
4

我正在開發熱門擴展。我想要做的是在訂單完成時創建新的數據庫記錄。我需要一些建議如何去做。 我如何理解一種方法是創建自定義方法的順序類,並註冊新的鉤子(我應該在初始化程序中註冊新鉤子?)。 其他方式是使用激活器,但我不知道如何訂閱事件。我應該在哪裏放置訂閱訂單事件的代碼。當Spree訂單完成時,如何調用自定義類方法!執行方法

module Spree 
    class Credit < ActiveRecord::Base 
    def create_new_line(order) 
     #I need call this method when order finalized  
    end 
    end 
end 

我找到了解決辦法。我的訂單裝飾看起來像這樣。

Spree::Order.class_eval do 
    register_update_hook :add_user_credits 
    def add_user_credits 
    if (!self.user.nil? and !self.completed_at.nil?) 
     # do some stuff, only for registered users and when order complete 
    end 
    end 
end 

回答

9

在您的解決方案中,我認爲每次更新oder時都會調用掛鉤。因此,如果您在訂單完成後更改某些方法,該方法將再次被調用。如果這樣的設計可能是正確的解決方案無論如何Spree建議直接使用狀態機回調做這樣的事情。例如:

Spree::Order.class_eval do 
    state_machine do 
    after_transition :to => :complete, :do => :add_user_credits 
    end 

    def add_user_credits   
    # do some stuff 
    end 
end 

這樣代碼將在訂單進入完整狀態後立即執行。

+0

看來你的解決方案更好。只是我無法找到如何測試它的方法,因爲如果我打電話給訂購方法敲定!,狀態並沒有改變。我的測試看起來像這樣[鏈接](https://gist.github.com/Dariusp/8936283)。它的作品當我添加hook時,state_machine解決方案在我測試瀏覽器時起作用。 – dpa

相關問題