Domanda

Sto cercando di avere file sotto myapplication/somefolder.Google e Stackoverflow dicono che dovrei aggiungere questo:

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

nel mio config/application.rb, così ho fatto.

Ma i file non vengono caricati.

Ho provato Namig somefolder/myclass.rb sia class Myclass e class Somefolder::Myclass ma ancora senza fortuna.

Posso vedere che la dir è stata trovata in Rails.application.config.autoload_paths in Console includa davvero la mia directory /path/to/myapplication/somefolder, in modo che dovrebbe essere a posto.

Tutte le altre domande intorno a questo argomento utilizzare theapp/app/somefolder o theapp/lib/somefolder ma non theapp/somefolder, quindi forse è il punto in cui si fa marcio.

Così ho provato a fare riferimento alla classe con ::Somefolder::MyClass ma nemmeno questo aiutato.

Sto usando le rotaie 3.2.1

È stato utile?

Soluzione

Ho appena corso a questo stesso oggi e ho deciso di immergersi in profondità.

Il motivo per cui non si vede in ActiveSupport::Dependencies.autoload_paths I percorsi che stai aggiungendo a config.autoload_paths in config/application.rb è che non vengono copiati fino a quando l'applicazione viene inizializzata.Vedere rails/engine.rb nel gemma 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
.

Eri con qualsiasi possibilità che cercasse di invocare MyClass da config/application.rb o, anche prima, da uno script o un modulo che richiede config/application.rb?In tal caso, dovrai richiedere esplicitamente il file che definisce MyClass, ad esempio.:

require File.expand_path('../../somefolder/my_class',  __FILE__)
# now use MyClass
.

Altri suggerimenti

La soluzione alternativa è quella di andare direttamente a ActiveSupport::Dependencies.autoload_paths direttamente.

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

Ma sto ancora cercando il motivo per cui config.autoload_paths non ha funzionato in modo che se pubblichi un ASWER a questo, lo accetterò!

Si deve nominare somefolder/my_class.rb per Autoload MyClass.Dovresti anche mantenere quella linea config.autoload_paths += %W(#{config.root}/somefolder) nel config/application.rb.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top