Question

Je me suis battu à gauche et à droite avec 3 rails et Bundler. Il y a quelques joyaux là-bas qui ne fonctionnent pas correctement si l'application des rails n'a pas encore été chargé. factory_girl et Shoulda sont les deux exemples, même sur la branche rails3. Prendre Shoulda comme exemple, lorsque vous essayez d'exécuter rake test:units je reçois l'erreur suivante:
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)>'

Creuser un peu plus profondément dans lib / Shoulda / rails, je vois ceci:
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}", "*")

Alors ... qu'est-ce qui se passe ici est tout Rails.root est défini, Rails.root == nul, donc RAILS_ROOT est utilisé, et RAILS_ROOT == néant, qui est ensuite transmis à Shoulda.autoload_macros. Il est évident que l'application des rails n'a pas encore été initialisé. Avec l'aide Rails3 Bundler maintenant, il y a eu un certain hubub plus du côté Bundler d'être en mesure de spécifier un ordre dans lequel les pierres précieuses sont nécessaires, mais je ne suis pas sûr que cela ou ne résoudrait pas le problème à la main.
En fin de compte mes questions est la suivante: Quand est-ce exactement le fichier environment.rb (qui initialise en fait la demande) ballotés dans tous? Y at-il de mal à se cogner lorsque l'application est initialisé et que cela se fasse avant la ligne Bundler.require dans config / application.rb? J'ai essayé de pirater Bundler pour spécifier l'ordre moi-même, et avoir la pierre précieuse rails dans le premier tiré, mais il ne me semble pas que la pierre précieuse nécessitant des rails en fait l'application initialise.
Comme cette ligne (dans config / application.rb) est appelée avant l'application est initialisé, une gemme dans le Bundler Gemfile qui requiert des rails à initialiser va dans le réservoir.

# Auto-require default libraries and those for the current Rails environment. Bundler.require :default, Rails.env

Était-ce utile?

La solution

Eh bien, il était en fait assez facile de tracer cette baisse. Toutes les bibliothèques de rails sont tirés dans dans application.rb. L'application elle-même est en cours d'initialisation dans environment.rb.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top