【问题标题】:Ruby on Rails - CallbacksRuby on Rails - 回调
【发布时间】: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

【问题讨论】:

标签: ruby-on-rails ruby callback


【解决方案1】:

虽然可能的重复是正确的,但为了在 rails 中更改模型而不编辑模型代码以显式包含监听,您可以使用以下内容:

Host::Managed.send(:include, ::HostExtensions::ManagedHost)

这告诉 Host::Managed 类它应该在运行时包含 HostExtensions::ManagedHost 模块。

为了完整起见,如果您在 Rails 应用程序中执行此操作,您可能需要在 Engine 类 (engine.rb) 中添加类似的内容:

config.to_prepare do
  require File.expand_path('../../../app/models/concerns/host_extensions/managedhost', __FILE__)
  Host::Managed.send(:include, ::HostExtensions::ManagedHost)
end

【讨论】:

    猜你喜欢
    • 2016-11-09
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 2017-01-14
    相关资源
    最近更新 更多