Подтвердить что ты не робот

Добавление каталога в путь загрузки в Rails?

Как и в случае с 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, который я ищу.

4b9b3361

Ответ 1

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

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

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

-

Для Rails 3, см. ниже ответы

Ответ 2

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

Ответ 3

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

# Add additional load paths for your own custom dirs
# config.load_paths += %W( #{config.root}/extras )

Ответ 4

Другое обновление для rails 3 - activesupport 3.0.0:

Вместо:

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

Вам может понадобиться следующее:

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

Ответ 5

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

# Add the widgets folder to the autoload path
Rails.application.configure do
  config.autoload_paths << "#{Rails.root}/app/widgets"
end

Ответ 6

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

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

  • создать новую папку и класс внутри каталога /app
  • запустите spring stop в командной строке
  • проверьте пути автозагрузки с помощью bin/rails r 'puts ActiveSupport::Dependencies.autoload_paths' в командной строке. Теперь должна быть указана новая папка.
  • запустите spring start в командной строке

Ответ 7

В 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. Возможно, и другие.

Ответ 8

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

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

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