2012-10-13 37 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