1

モデル オブザーバーがたくさんあるので、モデル フォルダーの下のサブディレクトリに整理したいと考えています。

model --> observer --> user_observer.rb, activity_observer.rb, etc.

サブディレクトリに配置する前に、次のようにオブザーバーをロードしていました。

Rails::Initializer.run do |config|
   config.active_record.observers = :user_observer, :activity_observer
end

サーバーを起動しようとすると、次のエラーが表示されます。

`load_missing_constant': Expected /Users/cscairns/source/myapp/app/models/observer/user_observer.rb to define UserObserver (LoadError)

オブザーバーがどのように見えるようになったので、environment.rb で使用する必要がある適切な構文は何ですか?

Observer::UserObserver < ActiveRecord::Observer
4

2 に答える 2

1

答えはここにあるようです:http://handyrailstips.com/tips/4-loading-observers-automatically-from-their-own-folder


web.archive.orgからコピーされたコンテンツ、2009-05-2519:36:17にアーカイブ

オブザーバーを自分のフォルダーから自動的にロードする

gavin

オブザーバーは、モデルをクリーンアップして乾燥させるための優れた方法です。メールの送信、メッセージのログ記録など、モデルの責任ではないものを処理するために、これらを頻繁に使用します。

オブザーバーを発見してから私を悩ませていることの1つは、オブザーバーがデフォルトで呼び出されないことです。代わりに、どのオブザーバーをロードする必要があるかを明示的に指定する必要があります(通常はenvironment.rbにあります)。

アプリの起動時にすべてのオブザーバーを環境からロードすることを計画している場合(これは可能性が高いです)、次をenvironment.rbファイルに追加して、アプリの起動時にすべてのオブザーバーを自動的にロードできます。

# config/environment.rb
Dir.chdir("#{Rails.root}/app/models") do
  config.active_record.observers = Dir["*_observer.rb"].collect {|ob_name| ob_name.split(".").first}
end

これは少し厄介に見えますが、ここで行っているのは、modelsフォルダー内のすべてのオブザーバーファイルの名前を見つけて、それぞれをロードするようにアプリを構成することだけです。

config.active_record.observers =

オブザーバーについて私を悩ませているもう1つのことは、デフォルトでモデルフォルダーに保存されていることです。複数のモデルと複数のオブザーバーを使用して大きなアプリを構築している場合、これはかなり雑然として混乱する可能性があります。

これを回避するために、私は通常、app/に「observers」という新しいフォルダーを作成します。次に、作成したオブザーバーをこのフォルダーに移動します。

このフォルダが起動時にロードされることを確認するために、environment.rbに以下を追加します

config.load_paths += "#{Rails.root}/app/observers"

単純!

オブザーバーを自動的にロードする前のヒントと一緒にこれを使用する場合は、検索しているディレクトリの名前をモデルからオブザーバーに変更する必要があります。

# config/environment.rb
Dir.chdir("#{Rails.root}/app/observers") do
  config.active_record.observers = Dir["*_observer.rb"].collect {|ob_name| ob_name.split(".").first}
end

新しいオブザーバーを作成した後、またはenvironment.rbに変更を加えた後は、アプリを再起動することを忘れないでください

于 2010-06-04T12:41:54.417 に答える
1

ケルイリンの答えによると、ページはもう存在しませんが、その記述されたコードは次のとおりです。

# config/environment.rb
Dir.chdir("#{Rails.root}/app/models") do
  config.active_record.observers = Dir["*_observer.rb"].collect {|ob_name|         ob_name.split(".").first}
end

ルートレベルの「app/observers」フォルダーを好む人のために:

# config/environment.rb
config.load_paths += "#{Rails.root}/app/observers"

Dir.chdir("#{Rails.root}/app/observers") do
  config.active_record.observers = Dir["*_observer.rb"].collect {|ob_name| ob_name.split(".").first}
end
于 2014-03-18T16:59:57.883 に答える