Я тоже столкнулся с этим.Есть (как минимум?) 2 возможных проблемы:
- Ваш модуль не находится в пути автозагрузки
Ищите в config/application.rb
строка:
config.autoload_paths += %W(#{config.root}/extras)
Если это закомментировано, раскомментируйте его.Эта строка включит автозагрузку для всех файлов внутри extras
, а также для всех файлов в подкаталогах extras
.Возможно, наиболее безопасно переместить ваши модули в extras
, но если вы действительно хотите оставить их в lib
, измените строку на:
config.autoload_paths += %W(#{config.root}/extras #{config.root}/lib)
- Ваш модуль находится впуть автозагрузки, но не названный так, как Rails ожидает
(см .: Rails 2.3.5: Как получить доступ к коду внутри lib / directory / file.rb?)
По соглашению Rails хочет, чтобы имя вашего модуля соответствовало иерархии каталогов и имени файла.Таким образом, файл extras/mylib.rb
должен содержать
module Mylib # not MyLib or My_lib
...
end
Это также работает для подкаталогов, поэтому файл extras/mydir/mylib.rb
должен содержать:
module Mydir
module Mylib # or class Mylib
...
end
end
Это соглашение о присвоении именТо же самое, что Rails ожидает от контроллеров и моделей.Подчеркивание в имени файла превращается в название класса / модуля верблюжьего слуха.Ожидается, что файл с именем my_lib.rb
будет содержать module MyLib
(но не Mylib
).
ПРИМЕЧАНИЕ , что автозагрузка не означает, чтомодуль автоматически загружается при запуске;скорее, он автоматически загружается при первом использовании.Поэтому, даже если у вас есть какой-то код, например puts "hi from mylib"
в верхней части файла mylib.rb
, вы не увидите этот отпечаток, пока ваш код не использует где-то Mylib
.
Наконец, если вы действительно хотитемодули для загрузки при запуске , создайте файл с именем config/initializers/force_load_libraries.rb
и поместите его туда:
Dir.glob("#{Rails.root}/extras/force_load/*.rb").each { |f| require f }
Теперь перейдите и поместите свои библиотеки в extras/force_load
, и они должны загружаться, когда Railsзапускается.