Автозагрузка Rails 3
У меня есть класс ConstData:
class ConstData
US_CITIES = ['miami', 'new york']
EUROPERN_CITIES = ['madrid', 'london']
end
Сохраняется в /lib/const _data.rb
Идея заключается в том, что внутри модели, контроллера или представления я могу сделать:
ConstData::US_CITIES
, чтобы получить US_CITIES и т.д.
Rails должен автоматически загрузить этот класс, я получил это от:
http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/662abfd1df9b2612?hl=en
Однако это не работает. Может ли кто-нибудь объяснить мне, как это сделать?
Ответы
Ответ 1
Сообщение @daniel означает, что это с 2008 года. Rails изменился с тех пор.
На самом деле, совсем недавно. Rails3 не загружает каталог lib/.
Вы можете легко его активировать. Открыть config/application.rb
И добавить в config (в классе Application
) следующее:
config.autoload_paths += %W(#{config.root}/lib)
Затем ваш lib/dir будет загружен автоматически.
Ответ 2
Причина autoload_paths не сработала для вас, и вы были вынуждены делать:
Dir["lib/**/*.rb"].each do |path|
require_dependency path
end
заключается в том, что вы забыли пространство имен вашего класса.
lib/awesome/stuffs.rb должен содержать класс/модуль следующим образом:
class/module Awesome::Stuffs
....
но у вас было:
class/module Stuffs
....
Рельсы могут выполнять автозагрузку классов и модулей, имя которых соответствует пути к файлу и имени файла.
:)
Ответ 3
config.autoload_paths
не работал у меня. Я решил это, поставив следующее в ApplicationController
:
Dir["lib/**/*.rb"].each do |path|
require_dependency path
end
Ответ 4
Следуйте за решением для автоматической загрузки lib:
Удалите config.threadsafe!
из development.rb и production.rb;
Добавить в config/application.rb
:
config.autoload_paths += %W(#{config.root}/lib)
config.threadsafe!
config.dependency_loading = true