2013-07-23 24 views
2

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

我的观察者(在应用程序/模型/ 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) 

然而,这为e xactly与接受的答案相同Using an observer within an Engine

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

回答

4

我最终发现了这个问题。

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

但是没有办法提供包含名称空间的符号。相反,我们使用字符串提供命名空间和类

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

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

请注意,如果您在所有地方使用.observer =,观察者的最后一个列表是“胜利”,其余的将被覆盖。使用'config.active_record.observers || = [];而不是使用config.active_record.observers << MyEngine :: MyObserver'' – apeiros