У меня есть много образцовых наблюдателей, таким образом, я хочу организовать их в подкаталоге под образцовой папкой.
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
Похоже, что ответ можно найти здесь: http://handyrailstips.com/tips/4-loading-observers-automatically-from-their-own-folder.
Content Copied from web.archive.org, archived on 2009-05-25 19:36:17
by 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"
Просто!
Если вы решите использовать это вместе с предыдущим советом по автоматической загрузке наблюдателей, то вам придется изменить название директории, в которой вы ищете, с models на 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
.