Rails引擎中的观察者

时间:2013-07-23 07:22:05

标签: ruby-on-rails-3 observer-pattern rails-engines

我正在尝试在我的Rails引擎中创建一个观察者,它将观察我的主应用程序中的模型。

我的观察员(在app / models / my_engine / my_observer.rb中)是,

module MyEngine
  class MyObserver < ActiveRecord::Observer
    observe AppModel

    def after_create
      # code to run when callback is observed
    end
  end
end

为了注册观察者,我修改了我的引擎(在lib / my_engine / engine.rb中),

module MyEngine
  class Engine < ::Rails::Engine
    isolate_namespace MyEngine

    config.active_record.observers = MyEngine::MyObserver
  end
end

但是,当我尝试启动服务器时,出现以下错误,

... in `<class:Engine>': uninitialized constant MyEngine::MyObserver (NameError)

然而,这与Using an observer within an Engine

的接受答案完全相同

我是否在使用命名空间做错了什么?这是我想要实现的最佳方法吗?

1 个答案:

答案 0 :(得分:4)

我最终弄明白了这个问题。

实际情况是你无法在engine.rb文件中提供实际的类,因为在Rails运行配置时,这些东西都没有被加载。这就是为什么对于普通观察者我们提供符号而不是类。

但是,无法提供包含命名空间的符号。相反,我们在字符串中提供命名空间和类

module MyEngine
  class Engine < ::Rails::Engine
    isolate_namespace MyEngine

    config.active_record.observers = 'MyEngine::MyObserver'
  end
end