我有很多模型观察者,所以我想将它们组织在模型文件夹下的子目录中。
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
答案 0 :(得分:1)
在这里可以找到答案:http://handyrailstips.com/tips/4-loading-observers-automatically-from-their-own-folder。
内容从web.archive.org复制,存档于2009-05-25 19:36:17
由gavin
观察者是清理和干燥模型的好方法。我使用它们来处理发送邮件,记录消息以及其他任何不完全是模型责任的事情。
自从我发现观察者以来,有一件事就是我没有默认调用它们。相反,你必须明确说明应该加载哪些观察者(通常在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 =
另一件事让我觉得它默认存储在models文件夹中。如果你正在构建一个包含多个模型和几个观察者的大型应用程序,这可能会变得混乱和混乱。
为了解决这个问题,我通常在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进行任何更改
后重新启动应用答案 1 :(得分:1)
根据keruilin的回答,该页面不再存在,但其声明的代码:
# 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