2012-10-13 38 views
4

有沒有可能在類方法上使用ActiveSupport::Callbacks?更具體地說,在下面的模塊中,你會在哪裏放include ActiveSupport::Callbacks使define_callbacksrun_callbacks共享相同的狀態?ActiveSupport ::類方法的回調

module Handler 
    extend ActiveSupport::Concern 

    # If you put it here, define_callbacks is defined but run_callbacks is not 
    # include ActiveSupport::Callbacks 

    included do 
    class_eval do 
     define_callbacks :handle 
    end 
    end 

    module ClassMethods 
    # If you put it here, run_callbacks is defined but define_callbacks is not 
    # include ActiveSupport::Callbacks 

    def handle(task) 
     run_callbacks :handle do 
     p task 
     end 
    end 
    end 
end 

class HandlerExample 
    include Handler 
end 

更新

如果有可能,我一直無法確定,可以肯定的是不是ActiveSupport::Callbacks是專爲。最好在#handle中創建一個無狀態實例對象。

回答

2

雖然整個想法有點尷尬恕我直言,你已經把define_callbacks在錯誤的地方..你應該把它放在本徵類,例如,

eval < < -EOF class < < self; define_callbacks ..; EOF

然後你可以做「send:extend,ActiveSupport :: Callbacks」。這甚至可能工作。

但是我建議你重新考慮一下,並用一個標準的實現來解決,在實例上調用回調。

+0

我確實嘗試將它們放在本徵類中,也沒有工作。查看對象ID似乎'ActiveSupport :: Concern'和'ActiveSupport :: Callbacks'交互的方式對類方法來說效果不好。今天早些時候,我得出了與您所建議的相同的結論,併爲處理程序創建了一個實例對象。這是一種浪費,因爲除了任務外沒有任何狀態,但它比我更容易構建一個適用於類方法的回調實現。 – Sim