Domanda

Ho combattuto a destra ea sinistra con le rotaie 3 e bundler. Ci sono alcune gemme là fuori che non funzionano correttamente se l'applicazione rotaie non è stato ancora caricato. factory_girl e shoulda sono entrambi esempi, anche sul ramo rails3. Prendendo shoulda ad esempio, quando si cerca di eseguire rake test:units ottengo il seguente errore:
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)>'

Scavando un po 'più in profondità nella lib / Shoulda / rotaie, vedo questo:
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}", "*")

Quindi ... cosa sta succedendo qui è mentre Rails.root è definito, Rails.root == nil, quindi RAILS_ROOT viene utilizzato, e RAILS_ROOT == nil, che è poi stato trasmesso a Shoulda.autoload_macros. Ovviamente l'applicazione rotaie deve ancora essere inizializzato. Con Rails3 utilizzando Bundler ora, c'è stata una certa hubub sopra sul lato Bundler di essere in grado di specificare un ordine in cui sono richieste le gemme, ma non sono sicuro se questo risolverebbe il problema in questione.
In ultima analisi la mia domanda è questa: quando si fa esattamente il file environment.rb (che in realtà inizializza l'applicazione) ottenere tirato in? C'è qualche danno al urtando quando l'applicazione viene inizializzato e farlo accadere prima della linea Bundler.require in config / application.rb? Ho cercato di incidere bundler per specificare l'ordine di me stesso, e hanno le rotaie gemma tirato in prima, ma non mi sembra che richiedono la gemma rotaie in realtà inizializza l'applicazione.
Come questa linea (in config / application.rb) viene chiamato prima l'applicazione viene inizializzato, ogni gioiello in Bundler Gemfile che richiede delle guide da inizializzare sta per serbatoio.

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

È stato utile?

Soluzione

Beh, in realtà è stato abbastanza facile da rintracciare questo giù. Tutte le librerie rotaie vengono tirati in in application.rb. La stessa applicazione è in fase di inizializzazione in environment.rb.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top