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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top