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

私は最終的に問題を理解しました。

実際には、Rails が config を実行する時点では、これらはまだロードされていないため、engine.rb ファイルに実際のクラスを指定することはできません。これが、通常のオブザーバーに対して、クラスではなくシンボルを提供する理由です。

ただし、名前空間を含むシンボルを提供する方法はありません。代わりに、名前空間とクラスを string で提供します。

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

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