【问题标题】:Observers in Rails EnginesRails 引擎中的观察者
【发布时间】:2013-07-22 03:30:34
【问题描述】:

我正在尝试在我的 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 接受的答案完全相同

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

【问题讨论】:

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


    【解决方案1】:

    我最终发现了问题。

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

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

    module MyEngine
      class Engine < ::Rails::Engine
        isolate_namespace MyEngine
    
        config.active_record.observers = 'MyEngine::MyObserver'
      end
    end
    

    【讨论】:

    • 当心,如果你在所有地方使用 .observer=,最后一个观察者列表“获胜”,其余的被覆盖。请改用config.active_record.observers ||= []; config.active_record.observers &lt;&lt; 'MyEngine::MyObserver'
    猜你喜欢
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多