【问题标题】:Using an observer within an Engine在引擎中使用观察者
【发布时间】:2012-04-20 00:41:14
【问题描述】:

我创建了一个基本上用于我们所有项目的引擎。

现在我要做的是为这个引擎中的所有模型添加一个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)

【问题讨论】:

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


    【解决方案1】:

    在引擎中,您应该使用 lib/[engine_name]/engine.rb 而不是 application.rb

    另外,如果你在引擎中创建观察者,你需要命名它。

    【讨论】:

    • 感谢您的回复,我现在使用的是引擎文件而不是application.rb。此外,我将 AuthObserver 放置在命名空间中,就像我的引擎的其余部分一样。唯一的问题是,我怎样才能指向命名空间的观察者?使用 :baco_auth_observer 指向 BacoAuthObserver 而不是 Baco::AuthObserver。只是 :auth_observer 也不起作用。
    • 你可以在观察者内部使用observe方法来指出哪个模型是可观察的
    • 而且您不仅可以在配置中指向符号。 config.active_record.observers = Baco::AuthObserver也可以
    • 我已经更新了我的问题,指向 Baco::Auth::AuthObserver 在启动服务器时给出了uninitialized constant Baco::Auth::AuthObserver (NameError) ..
    • 通过将其名称更改为Baco::Auth::UserObserver 并添加observe 方法使其工作。非常感谢!
    猜你喜欢
    • 2013-07-22
    • 2021-09-25
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多