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


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

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 вам больше не нужно явно загружать папки из каталога приложений. Все папки, размещенные внутри, доступны напрямую. Вам не нужно прикасаться ни к одному из файлов конфигурации. Но кажется, что есть некоторые проблемы с весны.

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

  1. создайте новую папку и класс внутри каталога / app
  2. run spring stop в командной строке
  3. проверьте пути автоматической загрузки с bin/rails r 'puts ActiveSupport::Dependencies.autoload_paths' в командной строке. Теперь должна быть указана новая папка.
  4. 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"

на config/application.rb добавить config.autoload_path << "#{config.root}/dir/widgets"

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

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

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

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

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

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