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-25 19:36:17

从自己的文件夹中自动加载观察者

通过加文

观察者是清理和干燥模型的好方法。我经常使用它们来处理发送邮件、记录消息和其他任何不完全由模型负责的事情。

自从我发现观察者以来,困扰我的一件事是默认情况下不会调用它们。相反,您必须明确声明应该加载哪些观察者(通常在 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

这看起来有点乱,但您在这里所做的只是在模型文件夹中找到所有观察者文件的名称并配置您的应用程序以加载每个文件

config.active_record.observers =

让我对观察者感到困扰的另一件事是它们默认存储在模型文件夹中。如果您正在构建一个包含多个模型和多个观察者的大型应用程序,这可能会变得非常混乱和混乱。

为了解决这个问题,我通常在 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

根据 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
于 2014-03-18T16:59:57.883 回答