Come autoload i file nella cartella sotto la radice dell'app Rails
-
12-11-2019 - |
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
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
.