在environment.rb中加载观察者(在模型子目录中)的语法?

时间:2010-06-04 12:30:25

标签: ruby-on-rails model module environment subdirectory

我有很多模型观察者,所以我想将它们组织在模型文件夹下的子目录中。

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

2 个答案:

答案 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