Как автоматически загружать файлы в папку под корнем приложения rails - PullRequest
3 голосов
/ 24 февраля 2012

Я пытаюсь получить файлы под myapplication/somefolder.Google и Stackoverflow говорят, что я должен добавить это:

config.autoload_paths += %W(#{config.root}/somefolder)

в моем config/application.rb, так я и сделал.

Но файлы не загружаются.

Я попробовал namig somefolder/myclass.rb и class Myclass, и class Somefolder::Myclass, но все равно не повезло.

Я вижу, чтокаталог был найден в Rails.application.config.autoload_paths, в консоли действительно есть мой каталог /path/to/myapplication/somefolder, так что все должно быть в порядке.

Все остальные вопросы по этой теме используют theapp/app/somefolder или theapp/lib/somefolder, но не theapp/somefolder так что, может быть, именно там он и гниет.

Поэтому я попытался ссылаться на класс с помощью ::Somefolder::MyClass, но даже это не помогло.

Я использую Rails 3.2.1

Ответы [ 3 ]

2 голосов
/ 29 августа 2013

Сегодня я сам столкнулся с этим и решил погрузиться глубже.

Причина, по которой вы не видите в ActiveSupport::Dependencies.autoload_paths пути, которые вы добавляете к config.autoload_paths в config/application.rb, заключается в том, что они не являютсяне копируется до инициализации приложения.См. rails/engine.rb в самоцвете railties:

module Rails
  class Engine < Railtie
    …

    # Set the paths from which Rails will automatically load source files,
    # and the load_once paths.
    #
    # This needs to be an initializer, since it needs to run once
    # per engine and get the engine as a block parameter
    initializer :set_autoload_paths, :before => :bootstrap_hook do |app|
      ActiveSupport::Dependencies.autoload_paths.unshift(*_all_autoload_paths)
      ActiveSupport::Dependencies.autoload_once_paths.unshift(*_all_autoload_once_paths)

      # Freeze so future modifications will fail rather than do nothing mysteriously
      config.autoload_paths.freeze
      config.eager_load_paths.freeze
      config.autoload_once_paths.freeze
    end

    …

    def _all_autoload_paths
      @_all_autoload_paths ||= (config.autoload_paths + config.eager_load_paths + config.autoload_once_paths).uniq
    end

    …
  end
end

Вы случайно пытались вызвать MyClass из config/application.rb или даже раньше из сценария или модуля, для которого требуется config/application.rb?Если это так, вам потребуется явно указать файл, определяющий MyClass, например:

require File.expand_path('../../somefolder/my_class',  __FILE__)
# now use MyClass
1 голос
/ 14 сентября 2012

Вам нужно назвать somefolder/my_class.rb для автозагрузки MyClass.Вы также должны сохранить эту строку config.autoload_paths += %W(#{config.root}/somefolder) в своем config/application.rb.

1 голос
/ 24 февраля 2012

Обходной путь должен перейти к ActiveSupport::Dependencies.autoload_paths напрямую.

ActiveSupport::Dependencies.autoload_paths << "#{config.root}/somefolder"

Но я все еще ищу причину, по которой config.autoload_paths не работает, поэтому, если вы напишите об этом, я приму это!

...