Pregunta

He estado luchando izquierda y derecha con los carriles 3 y bundler. Hay algunas joyas por ahí que no funcionan correctamente si la aplicación rieles no se ha cargado todavía. factory_girl y la debería son ambos ejemplos, incluso en la rama rails3. Tomando como ejemplo la debería, al intentar ejecutar rake test:units me sale el siguiente error:
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)>'

Digging un poco más en lib / Shoulda / rieles, veo esto:
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}", "*")

Así que ... lo que está sucediendo aquí es Rails.root mientras se define, Rails.root == nula, por lo que se utiliza RAILS_ROOT y RAILS_ROOT == nil, que luego se pasa a Shoulda.autoload_macros. Es evidente que la aplicación rieles aún no se ha inicializado. Con el uso de Rails3 Bündler ahora, ha habido algunos hubub más en el lado Bündler de ser capaz de especificar un orden en el que se requiere que las gemas, pero no estoy seguro de si es o no resolvería el problema en cuestión.
En última instancia, mi pregunta es la siguiente: Cuando funciona exactamente el archivo environment.rb (que en realidad se inicializa la aplicación) en dejarse embaucar? ¿Hay algún daño al chocar cuando la aplicación se inicia y lo han suceder antes de la línea Bundler.require en config / application.rb? He tratado de cortar bundler para especificar el orden mismo, y tienen los rieles joya tiraron en la primera, pero no me parece que la exigencia de la gema rieles realidad inicializa la aplicación.
Como esta línea (en config / application.rb) se está llamando antes de que se inicia la aplicación, cualquier joya en el bundler Gemfile que requiere rieles para inicializar va a tanque.

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

¿Fue útil?

Solución

Bueno, en realidad era bastante fácil de rastrear esto. Todas las bibliotecas carriles están siendo arrastradas en en application.rb. La aplicación en sí se inicializa en environment.rb.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top