【发布时间】:2014-07-03 01:48:45
【问题描述】:
我的任务是为 Rails 应用程序(Foreman)实现一个非常基本的功能请求,并且偶然发现了一个似乎既非常基本又非常流行的问题。来自 Java 背景,我发现回调不像我通常期望的那样工作。
通常在 Java 中,当使用侦听器时,您可以为事件订阅任意代码段,当事件触发时,对象会遍历侦听器并通知每个侦听器。一个非常基本的例子是:
public class Foo {
private List<FooListener> foo_list = new List<FooListener>();
public void add_foo_listener(FooListener fooListener){
this.foo_list.add(fooListener);
}
private void on_foo_thing(){
foreach(foo : foo_list) {
fooListener.notify();
}
}
}
因此,您可以通过调用“add_foo_listener(fooListener)”从外部类中添加许多侦听器,当调用 on_foo_thing() 方法时会收到通知 - 无需对原始类进行任何修改。
在 ruby/rails 中是否有类似的东西?我要挂钩的类定义了以下挂钩:
define_model_callbacks :build, :only => :after
define_model_callbacks :provision, :only => :before
# Custom hooks will be executed after_commit
after_commit :build_hooks, :if => :persisted?
def build_hooks
return unless respond_to?(:old) && old && (build? != old.build?)
if build?
run_callbacks :build do
logger.debug { "custom hook after_build on #{name} will be executed if defined." }
end
else
run_callbacks :provision do
logger.debug { "custom hook before_provision on #{name} will be executed if defined." }
end
end
end
【问题讨论】:
-
如果我错了,请纠正我,但根据我对 ActiveSupport::Concern 的理解,我必须编辑原始类定义以包含我的 Concern 类,这个答案似乎重新执行.
标签: ruby-on-rails ruby callback