Wann genau wird die Rails3-Anwendung initialisiert?
-
19-09-2019 - |
Frage
Ich habe links und rechts mit Rails 3 und Bundler gekämpft.Es gibt ein paar Juwelen, die nicht richtig funktionieren, wenn die Rails-Anwendung noch nicht geladen wurde.Factory_girl und Shoulda sind beide Beispiele, sogar im Rails3-Zweig.Nehmen Sie „shoulda“ als Beispiel, wenn Sie versuchen zu rennen rake test:units
Ich erhalte die folgende Fehlermeldung:
DEPRECATION WARNING: RAILS_ROOT is deprecated! Use Rails.root instead. (called from autoload_macros at c:/code/test_harness/vendor/windows_gems/gems/shoulda-2.10.3/lib/shoulda/autoload_macros.rb:40)
c:/code/test_harness/vendor/windows_gems/gems/shoulda-2.10.3/lib/shoulda/autoload_macros.rb:44:in 'join': can't convert #<Class:0x232b7c0> into String (TypeError)
from c:/code/test_harness/vendor/windows_gems/gems/shoulda-2.10.3/lib/shoulda/autoload_macros.rb:44:in 'block in autoload_macros'
from c:/code/test_harness/vendor/windows_gems/gems/shoulda-2.10.3/lib/shoulda/autoload_macros.rb:44:in 'map'
from c:/code/test_harness/vendor/windows_gems/gems/shoulda-2.10.3/lib/shoulda/autoload_macros.rb:44:in 'autoload_macros'
from c:/code/test_harness/vendor/windows_gems/gems/shoulda-2.10.3/lib/shoulda/rails.rb:17:in '<top (required)>'
Wenn ich etwas tiefer in lib/shoulda/rails eintauche, sehe ich Folgendes:
root = if defined?(Rails.root) && Rails.root
Rails.root
else
RAILS_ROOT
end
# load in the 3rd party macros from vendorized plugins and gems
Shoulda.autoload_macros root, File.join("vendor", "{plugins,gems}", "*")
Also ... was hier passiert, ist, während Rails.root definiert ist, Rails.root == nil, also wird RAILS_ROOT verwendet, und RAILS_ROOT==nil, was dann an Shoulda.autoload_macros weitergegeben wird.Offensichtlich muss die Rails-App noch initialisiert werden.Da Rails3 jetzt Bundler verwendet, gab es auf der Bundler-Seite einige Diskussionen darüber, eine Reihenfolge angeben zu können, in der die Edelsteine erforderlich sind, aber ich bin mir nicht sicher, ob dies das vorliegende Problem lösen würde oder nicht.
Letztendlich sind meine Fragen folgende:Wann genau wird die Datei „environment.rb“ (die die Anwendung tatsächlich initialisiert) eingezogen?Ist es schädlich, wenn die App initialisiert wird und dies vor der Bundler.require-Zeile in config/application.rb geschieht?Ich habe versucht, den Bundler zu hacken, um die Reihenfolge selbst anzugeben, und habe zuerst den Rails-Gem eingezogen, aber es scheint mir nicht, dass das Erfordernis des Rails-Gems die Anwendung tatsächlich initialisiert.
Da diese Zeile (in config/application.rb) aufgerufen wird, bevor die App initialisiert wird, wird jedes Gem in der Bundler-Gemfile, das eine Initialisierung von Rails erfordert, tanken.
# Auto-require default libraries and those for the current Rails environment.
Bundler.require :default, Rails.env
Lösung
Nun ja, es war eigentlich ziemlich einfach, dem auf die Spur zu kommen.Alle Schienenbibliotheken werden eingezogen application.rb
.Die App selbst wird in initialisiert environment.rb
.