2

我正在尝试在我的 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)

然而,这与在引擎中使用观察者的公认答案完全相同

我在命名空间上做错了吗?这是我想要实现的最佳方法吗?

4

1 回答 1

4

我最终弄清楚了问题所在。

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

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

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

    config.active_record.observers = 'MyEngine::MyObserver'
  end
end
于 2013-07-24T00:40:57.893 回答