Добавить каталог к пути нагрузка на рельсы?
начиная с 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
метод, который я ищу.
8 ответов:
в текущей версии Rails (3.2.8), это было изменено в приложение.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
принимает массив путей, из которых рельсы будут автоматически загружать константы. по умолчанию-все каталоги подapp
.http://guides.rubyonrails.org/configuring.html
от комментатора (хакунина) ниже:
если каталог под
app/
, вам не нужно добавлять его в любом месте, он должен просто работать по умолчанию (определенно в 3.2.12). Рельсы имеетeager_load_paths
что действует какautoload_paths
в развитии, и нетерпеливой нагрузке в продукции. всеapp/*
каталоги автоматически добавляются туда.
на старые версии рельсов:
вы можете сделать это в вашей среде.файл config РБ.
config.load_paths << "#{RAILS_ROOT}/app/widgets"
--
на рельсы 3 см. ответы ниже
в Rails 3, Вы можете установить это в config/application.rb, где этот образец предоставляется по умолчанию:
# Add additional load paths for your own custom dirs # config.load_paths += %W( #{config.root}/extras )
на рельсы 5 вам больше не нужно явно загружать папки из каталога приложений. Все папки, размещенные внутри, доступны напрямую. Вам не нужно прикасаться ни к одному из файлов конфигурации. Но кажется, что есть некоторые проблемы с весны.
таким образом, новый рабочий процесс:
- создайте новую папку и класс внутри каталога / app
- run
spring stop
в командной строке- проверьте пути автоматической загрузки с
bin/rails r 'puts ActiveSupport::Dependencies.autoload_paths'
в командной строке. Теперь должна быть указана новая папка.- run
spring start
в командной строке
на Rails 5 вам нужно добавить следующий код в среду.РБ:
# Add the widgets folder to the autoload path Rails.application.configure do config.autoload_paths << "#{Rails.root}/app/widgets" end
еще одно обновление для rails 3 -- activesupport 3.0.0:
вместо:
ActiveSupport::Dependencies.load_paths << "#{RAILS_ROOT}/app/widgets"
возможно, вам придется сделать это:
ActiveSupport::Dependencies.autoload_paths << "#{RAILS_ROOT}/app/widgets"