Автозагрузка 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