Ответ 1
Для старых версий Rails:
Вы можете сделать это в конфигурационном файле environment.rb.
config.load_paths << "#{RAILS_ROOT}/app/widgets"
-
Для Rails 3, см. ниже ответы
Как и в случае с Rails 2.3, какой правильный способ добавить каталог в путь загрузки, чтобы он подключался к механизмам автоматической перезагрузки Rails?
В конкретном примере, о котором я думаю, у меня есть класс, который имеет несколько подклассов с использованием STI, и я подумал, что было бы неплохо поместить их в подкаталог, а не загромождать верхний уровень. Поэтому у меня было бы что-то вроде:
#app/models/widget.rb
class Widget < ActiveRecord::Base
add_to_load_path File.join(File.dirname(__FILE__), "widgets")
end
#app/models/widgets/bar_widget.rb
class BarWidget < Widget
end
#app/models/widgets/foo_widget.rb
class FooWidget < Widget
end
Это метод add_to_load_path
, который я ищу.
Для старых версий Rails:
Вы можете сделать это в конфигурационном файле environment.rb.
config.load_paths << "#{RAILS_ROOT}/app/widgets"
-
Для Rails 3, см. ниже ответы
В текущей версии Rails (3.2.8) это было изменено в файле application.rb.
Код в настоящее время прокомментирован как:
# Custom directories with classes and modules you want to be autoloadable.
# config.autoload_paths += %W(#{config.root}/extras)
Необходимо обновить значение autoload_paths. Попытка изменить прежнюю переменную load_paths вызывает эту ошибку.
/configuration.rb:85:in `method_missing': undefined method `load_paths' for #<Rails::Application::Configuration:0xac670b4> (NoMethodError)
для примера, для каждого пути для добавления в конфигурацию autoload_paths добавьте строку, похожую на следующую:
config.autoload_paths += %W(#{config.root}/app/validators)
config.autoload_paths
принимает массив путей, из которых Rails будет автонастраивать константы. По умолчанию все каталоги находятся под app
.
http://guides.rubyonrails.org/configuring.html
От комментатора (hakunin) ниже:
Если каталог находится под app/
, вам не нужно добавлять его нигде, он должен работать только по умолчанию (определенно в 3.2.12). Rails имеет eager_load_paths
, который действует как autoload_paths
в процессе разработки и обладает высокой загрузкой. Здесь автоматически добавляются все каталоги app/*
.
В Rails 3 вы можете установить это в config/application.rb, где этот образец предоставляется по умолчанию:
# Add additional load paths for your own custom dirs
# config.load_paths += %W( #{config.root}/extras )
Другое обновление для rails 3 - activesupport 3.0.0:
Вместо:
ActiveSupport::Dependencies.load_paths << "#{RAILS_ROOT}/app/widgets"
Вам может понадобиться следующее:
ActiveSupport::Dependencies.autoload_paths << "#{RAILS_ROOT}/app/widgets"
В Rails 5 вам нужно добавить следующий код в environment.rb:
# Add the widgets folder to the autoload path
Rails.application.configure do
config.autoload_paths << "#{Rails.root}/app/widgets"
end
В Rails 5 вам больше не нужно явно загружать папки из каталога приложений. Все папки, размещенные внутри, доступны напрямую. Вам не нужно касаться каких-либо конфигурационных файлов. Но кажется, что есть проблемы с Spring.
Таким образом, новый рабочий процесс:
spring stop
в командной строкеbin/rails r 'puts ActiveSupport::Dependencies.autoload_paths'
в командной строке. Теперь должна быть указана новая папка.spring start
в командной строкеВ config/application.rb
добавить config.autoload_path << "#{config.root}/dir/widgets"
Файл должен выглядеть так:
module MyApp
class Application < Rails::Application
config.autoload_paths << "config.root}/widgets"
end
end
Я знаю, что это работает для Rails 4 и 5. Возможно, и другие.
Я обнаружил, что мне нужно сделать это после блока конфигурации - больше нет доступа к объекту конфигурации.
Это сделало трюк
ActiveSupport::Dependencies.load_paths << "#{RAILS_ROOT}/app/widgets"