Pergunta

Venho lutando esquerda e direita com Rails 3 e bundler. Há algumas jóias lá fora, que não funcionam corretamente se o aplicativo trilhos ainda não foi carregado. factory_girl e shoulda são exemplos, mesmo no ramo rails3. Tomando deveria ter como exemplo, ao tentar executar rake test:units eu recebo o seguinte erro:
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)>'

cavar um pouco mais fundo no lib / shoulda / rails, eu vejo isso:
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}", "*")

Então ... o que está acontecendo aqui é enquanto Rails.root é definido, Rails.root == nil, então RAILS_ROOT é usado, e RAILS_ROOT == nil, que é então a ser repassado para Shoulda.autoload_macros. Obviamente, o aplicativo de trilhos ainda tem de ser inicializado. Com Rails3 usando Bundler agora, tem havido alguns hubub mais no lado do Bundler sobre ser capaz de especificar uma ordem em que são necessárias as jóias, mas eu não tenho certeza se deve ou não isso resolveria o problema na mão.
Em última análise, as minhas perguntas é esta: Quando faz exatamente o arquivo environment.rb (que na verdade inicializa o aplicativo) são puxadas em? Existe algum dano a bater-se quando o aplicativo é inicializado e que isso aconteça antes da linha Bundler.require em config / application.rb? Eu tentei cortar bundler para especificar a ordem mim mesmo, e tiver os trilhos gem puxado em primeiro lugar, mas não me parece que exigir que o rails gem realmente inicializa o aplicativo.
Como esta linha (em config / application.rb) está sendo chamado antes o aplicativo é inicializado, qualquer jóia no Gemfile bundler que requer trilhos para ser inicializado vai tanque.

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

Foi útil?

Solução

Bem, foi realmente bastante fácil rastrear esse baixo. Todas as bibliotecas trilhos estão sendo puxado em application.rb. O aplicativo em si está sendo inicializado em environment.rb.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top