Когда, точно, приложение Rails3 инициализируется? - PullRequest
4 голосов
/ 12 марта 2010

Я боролся влево и вправо с рельсами 3 и связкой. Есть несколько драгоценных камней, которые не работают должным образом, если приложение rails еще не было загружено. factory_girl и musta - оба примера, даже на ветке rails3. Взяв в качестве примера musta, при попытке запустить 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<br> Rails.root<br> else<br> RAILS_ROOT<br> end<br> # load in the 3rd party macros from vendorized plugins and gems<br> 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? Я попытался взломать упаковщик, чтобы указать порядок самостоятельно, и сначала выдвинул драгоценный камень rails, но мне не кажется, что требование драгоценного камня rails фактически инициализирует приложение.
Так как эта строка (в config / application.rb) вызывается до инициализации приложения, любой гем в Gemfile, который требует инициализации rails, собирается в бак.

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

1 Ответ

1 голос
/ 07 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...