2012-04-06 45 views
1

我創建了一個基本上用於我們所有項目的引擎。在引擎中使用觀察器

現在我想要做的是添加一個before_create回調到這個引擎中的所有模型。

經過一番搜索後,我發現觀察者是要走的路。

所以,我創造了這個觀察:

# app/models/baco/auth/auth_observer 

class Baco::Auth::AuthObserver < ActiveRecord::Observer 

    def before_create(record) 
    p record 
    end 

end 

現在我需要把它添加到應用程序,當然在我的引擎有沒有這樣的文件作爲application.rb中,所以我已經把它放在我的引擎:

# lib/baco/auth/engine.rb 

require 'rails' 
require 'devise' 

module Baco 
    module Auth 
    class Engine < Rails::Engine 

     engine_name 'baco_auth' 
     config.active_record.observers = :auth_observer 

    end 
    end 
end 

,但我得到關於啓動服務器以下錯誤:

.../.rvm/gems/ruby-1.9.3-p125/gems/activesupport-3.2.1/lib/active_support/inflector/methods.rb:229:in `block in constantize': uninitialized constant AuthObserver (NameError) 

回答

2

在恩gines而不是application.rb你應該使用lib/[engine_name]/engine.rb

另外,如果你在引擎中創建觀察者,你需要命名空間它。

+0

感謝您的回覆,我現在使用引擎文件而不是application.rb。我還將AuthObserver放置在名稱空間中,就像我的引擎的其餘部分一樣。唯一的問題是,我如何指向名稱空間的觀察者?使用:baco_auth_observer指向BacoAuthObserver而不是Baco :: AuthObserver。只是:auth_observer也不起作用。 – 2012-04-06 11:32:38

+1

您可以在observer中使用'observe'方法來指出哪個模型是可觀察的 – MikDiet 2012-04-06 12:57:44

+2

而且您不僅可以在config中指向符號。 'config.active_record.observers = Baco :: AuthObserver'也可以接受 – MikDiet 2012-04-06 13:00:54