-exactly-什么时候Rails3应用程序初始化?

时间:2010-03-12 04:58:27

标签: ruby-on-rails rubygems initialization ruby-on-rails-3 bundler

我一直在用铁轨3和捆绑器左右战斗。如果尚未加载rails应用程序,那么有一些gem无法正常工作。 factory_girl和shoulda都是示例,即使在rails3分支上也是如此。 以shoulda为例,当试图运行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)>'

深入挖掘lib / shoulda / rails,我看到了这一点:
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应用尚未初始化。现在使用Bundler的Rails3,在Bundler方面有一些关于能够指定需要宝石的顺序的hubub,但我不确定这是否能解决手头的问题。
最终我的问题是:什么时候环境文件(实际初始化应用程序)确实被拉入?应用程序初始化并在config / application.rb中的Bundler.require行之前发生时,是否有任何损害?我试图破解捆绑器来自己指定订单,并先将rails gem拉入,但在我看来并不需要rails gem实际初始化应用程序。
在初始化应用程序之前调用此行(在config / application.rb中)时,捆绑器Gemfile中需要初始化rails的任何gem都将进入tank。

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

1 个答案:

答案 0 :(得分:1)

嗯,实际上很容易追踪到这一点。所有rails库都在application.rb中引入。应用程序本身正在environment.rb初始化。