Добавление каталога в путь загрузки в Rails? - PullRequest
63 голосов
/ 03 августа 2009

Начиная с 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 ]

107 голосов
/ 10 октября 2012

В текущей версии 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


От комментатора (хакунина) ниже:

Если каталог находится под app/, вам не нужно никуда добавлять его, он должен просто работать по умолчанию (определенно в 3.2.12). Rails имеет eager_load_paths, который действует как autoload_paths в разработке и увеличивает нагрузку на производство. Все каталоги app/* автоматически добавляются туда.

60 голосов
/ 03 августа 2009

Для старых версий Rails:

Вы можете сделать это в вашем конфигурационном файле environment.rb.

config.load_paths << "#{RAILS_ROOT}/app/widgets"

-

Для Рельсы 3 , см. Ответы ниже

27 голосов
/ 06 сентября 2010

В Rails 3 вы можете установить это в config / application.rb, где этот образец предоставляется по умолчанию:

# Add additional load paths for your own custom dirs
# config.load_paths += %W( #{config.root}/extras )
19 голосов
/ 15 февраля 2017

В Rails 5 вам больше не нужно явно загружать папки из каталога приложения. Все папки, размещенные внутри, доступны напрямую. Вам не нужно трогать любой из файлов конфигурации. Но кажется, что с Spring есть некоторые проблемы.

Таким образом, новый рабочий процесс:

  1. создайте новую папку и класс в каталоге / app
  2. запустить spring stop в командной строке
  3. проверьте пути автозагрузки с bin/rails r 'puts ActiveSupport::Dependencies.autoload_paths' в командной строке. Новая папка должна появиться в списке.
  4. запустить spring start в командной строке
10 голосов
/ 04 сентября 2016

На Rails 5 вам нужно добавить следующий код в environment.rb:

# Add the widgets folder to the autoload path
Rails.application.configure do
  config.autoload_paths << "#{Rails.root}/app/widgets"
end
8 голосов
/ 13 октября 2010

Еще одно обновление для rails 3 - activesupport 3.0.0:

Вместо:

ActiveSupport::Dependencies.load_paths << "#{RAILS_ROOT}/app/widgets"

Возможно, вам понадобится сделать это:

ActiveSupport::Dependencies.autoload_paths << "#{RAILS_ROOT}/app/widgets"
1 голос
/ 10 октября 2017

В config/application.rb добавить config.autoload_paths << "#{config.root}/models/widgets".

Файл должен выглядеть так:

module MyApp
  class Application < Rails::Application
    config.autoload_paths << "#{config.root}/models/widgets"
  end
end

Я знаю, что это работает для Rails 4 и 5. Возможно, и для других.

1 голос
/ 27 сентября 2009

Я обнаружил, что мне нужно сделать это после блока конфигурации - больше нет доступа к объекту конфигурации.

Это сделало трюк

ActiveSupport::Dependencies.load_paths << "#{RAILS_ROOT}/app/widgets"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...