4

Я сражался влево и вправо с помощью рельсов 3 и пучка. Есть несколько камней, которые не работают должным образом, если приложение rails еще не загружено. 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)>' Когда -exactly - приложение Rails3 получает инициализацию?

рыть немного глубже в Lib/Shoulda/рельсы, я вижу это:
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 (который фактически инициализирует приложение) втягивается? Есть ли какой-либо вред, когда вы запускаете приложение, и выполняйте его до строки Bundler.require в config/application.rb? Я попытался взломать связку, чтобы указать порядок сам, и сначала нарисовал жерл рельсов, но мне не кажется, что для того, чтобы жемчужина рельсов фактически инициализировала приложение.
Поскольку эта строка (в config/application.rb) вызывается до того, как приложение будет инициализировано, любой драгоценный камень в наборе Gemfile, который требует инициализации рельсов, собирается в резервуар.

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

ответ

1

Ну, это было на самом деле довольно легко проследить это вниз. Все библиотеки рельсов втягиваются в application.rb. Само приложение инициализируется в environment.rb.