4

我一直在與軌道3和打包機左右作戰。如果rails應用程序尚未加載,那麼有幾個gem不能正常工作。 factory_girl和shoulda都是例子,即使在rails3分支上也是如此。 以早該爲例,試圖運行rake test:units我收到以下錯誤時:
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)>' 當 - 完全 - Rails3應用程序是否被初始化?

挖成深一點的lib /早該/護欄,我看到:
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}", "*")

所以.. 。這裏發生了什麼是Rails.root被定義,Rails.root == nil,所以使用RAILS_ROOT,RAILS_ROOT == nil,然後傳遞給Shoulda.autoload_macros。很明顯,Rails應用尚未初始化。現在Rails3使用Bundler,在Bundler方面有一些關於能夠指定需要的寶石的命令,但我不確定這是否能解決手頭的問題。
最終我的問題是這樣的:什麼時候environment.rb文件(實際上初始化應用程序)被拉入?在應用程序初始化時遇到碰撞並在config/application.rb中的Bundler.require行之前發生?我試圖破解bundler來自己指定順序,並首先將rails gem拉進來,但在我看來並不需要使用rails gem來初始化應用程序。
由於該行(在config/application.rb中)在應用程序初始化之前被調用,所以需要導軌初始化的打包器Gemfile中的任何gem都將被打開。

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

回答

1

那麼,它實際上是很容易追查下來。所有的rails庫都被拉入application.rb。該應用程序本身正在初始化在environment.rb