4

Je me suis battu à gauche et à droite avec les rails 3 et bundler. Il y a quelques gemmes qui ne fonctionnent pas correctement si l'application rails n'a pas encore été chargée. factory_girl et shoulda sont deux exemples, même sur la branche rails3. Prendre Shoulda comme un exemple, en essayant de courir 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)>' Quand l'application Rails3 est-elle correctement initialisée?

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}", "*")

So .. Ce qui se passe ici est alors que Rails.root est défini, Rails.root == nil, donc RAILS_ROOT est utilisé, et RAILS_ROOT == nil, qui est ensuite transmis à Shoulda.autoload_macros. De toute évidence, l'application rails n'a pas encore été initialisée. Avec Rails3 utilisant Bundler maintenant, il y a eu une certaine confusion sur le côté de Bundler à propos de pouvoir spécifier un ordre dans lequel les gemmes sont requises, mais je ne suis pas sûr que cela résoudrait le problème.
En fin de compte, mes questions sont les suivantes: Quand exactement le fichier environment.rb (qui initialise réellement l'application) est-il récupéré? Y a-t-il un inconvénient à augmenter lorsque l'application est initialisée et que cela arrive avant la ligne Bundler.require dans config/application.rb? J'ai essayé de bidouiller bundler pour spécifier la commande moi-même, et ai les gemmes de rails tirées en premier, mais il ne me semble pas qu'exiger la gemme de rails initialise réellement l'application.
Lorsque cette ligne (dans config/application.rb) est appelée avant l'initialisation de l'application, toute gemme dans le bundler Gemfile qui nécessite l'initialisation des rails va se charger.

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

Répondre

1

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