This project is archived and is in readonly mode.
Model classes are loaded before I18n is set when running tests.
Reported by Robert Pankowecki | September 1st, 2010 @ 04:59 PM
Model classes should be always loaded after full framework configuration.
# config/locales/en.yml
en:
hello: "Hello world"
# config/locales/pl.yml
pl:
hello: "Witaj swiecie"
# app/models/my_model.rb
class MyModel < ActiveRecord::Base
raise I18n.available_locales.inspect # just to demonstrate the bug
end
# test/unit/my_model_test.rb
require 'test_helper'
class MyModelTest < ActiveSupport::TestCase
test "the truth" { MyModel }
end
As you can see there are 2 files with 2 different locales and my class depends on them ex.:
class MyModel < ActiveRecord::Base
I18n.available_locales.each do |locale|
define_method("name_#{locale}") { ... do something ...} # This is what I actually do.
end
end
When running from the console
> rails cosnole
Loading development environment (Rails 3.0.0)
ruby-1.9.2-head > MyModel
RuntimeError: [:en, :pl]
from /home/rupert/test/r3koma0/app/models/my_model.rb:3:in `<class:MyModel>'
from /home/rupert/test/r3koma0/app/models/my_model.rb:1:in `<top (required)>'
everything is fine. Both locales ([:en, :pl]) are found and I'm happy.
However when running test:
ruby -Ilib:test test/unit/my_model_test.rb
/home/rupert/test/r3koma0/app/models/my_model.rb:3:in `<class:MyModel>': [:en] (RuntimeError)
from /home/rupert/test/r3koma0/app/models/my_model.rb:1:in `<top (required)>'
from /home/rupert/.rvm/gems/ruby-1.9.2-head/gems/activesupport-3.0.0/lib/active_support/dependencies.rb:239:in `require'
from /home/rupert/.rvm/gems/ruby-1.9.2-head/gems/activesupport-3.0.0/lib/active_support/dependencies.rb:239:in `block in require'
from /home/rupert/.rvm/gems/ruby-1.9.2-head/gems/activesupport-3.0.0/lib/active_support/dependencies.rb:227:in `load_dependency'
from /home/rupert/.rvm/gems/ruby-1.9.2-head/gems/activesupport-3.0.0/lib/active_support/dependencies.rb:239:in `require'
from /home/rupert/.rvm/gems/ruby-1.9.2-head/gems/activesupport-3.0.0/lib/active_support/dependencies.rb:346:in `require_or_load'
from /home/rupert/.rvm/gems/ruby-1.9.2-head/gems/activesupport-3.0.0/lib/active_support/dependencies.rb:300:in `depend_on'
from /home/rupert/.rvm/gems/ruby-1.9.2-head/gems/activesupport-3.0.0/lib/active_support/dependencies.rb:216:in `require_dependency'
from /home/rupert/.rvm/gems/ruby-1.9.2-head/gems/railties-3.0.0/lib/rails/engine.rb:138:in `block (2 levels) in eager_load!'
from /home/rupert/.rvm/gems/ruby-1.9.2-head/gems/railties-3.0.0/lib/rails/engine.rb:137:in `each'
from /home/rupert/.rvm/gems/ruby-1.9.2-head/gems/railties-3.0.0/lib/rails/engine.rb:137:in `block in eager_load!'
from /home/rupert/.rvm/gems/ruby-1.9.2-head/gems/railties-3.0.0/lib/rails/engine.rb:135:in `each'
from /home/rupert/.rvm/gems/ruby-1.9.2-head/gems/railties-3.0.0/lib/rails/engine.rb:135:in `eager_load!'
from /home/rupert/.rvm/gems/ruby-1.9.2-head/gems/railties-3.0.0/lib/rails/application.rb:108:in `eager_load!'
from /home/rupert/.rvm/gems/ruby-1.9.2-head/gems/railties-3.0.0/lib/rails/application/finisher.rb:41:in `block in <module:Finisher>'
from /home/rupert/.rvm/gems/ruby-1.9.2-head/gems/railties-3.0.0/lib/rails/initializable.rb:25:in `instance_exec'
from /home/rupert/.rvm/gems/ruby-1.9.2-head/gems/railties-3.0.0/lib/rails/initializable.rb:25:in `run'
from /home/rupert/.rvm/gems/ruby-1.9.2-head/gems/railties-3.0.0/lib/rails/initializable.rb:50:in `block in run_initializers'
from /home/rupert/.rvm/gems/ruby-1.9.2-head/gems/railties-3.0.0/lib/rails/initializable.rb:49:in `each'
from /home/rupert/.rvm/gems/ruby-1.9.2-head/gems/railties-3.0.0/lib/rails/initializable.rb:49:in `run_initializers'
from /home/rupert/.rvm/gems/ruby-1.9.2-head/gems/railties-3.0.0/lib/rails/application.rb:134:in `initialize!'
from /home/rupert/.rvm/gems/ruby-1.9.2-head/gems/railties-3.0.0/lib/rails/application.rb:77:in `method_missing'
from /home/rupert/test/r3koma0/config/environment.rb:5:in `<top (required)>'
from <internal:lib/rubygems/custom_require>:29:in `require'
from <internal:lib/rubygems/custom_require>:29:in `require'
from /home/rupert/test/r3koma0/test/test_helper.rb:2:in `<top (required)>'
from <internal:lib/rubygems/custom_require>:29:in `require'
from <internal:lib/rubygems/custom_require>:29:in `require'
from test/unit/my_model_test.rb:1:in `<main>
As you can see during the test something is loaded in a different order and I18n is not set yet, thus only one locale ([:en]) is found. Maybe eager_load! is called to early before loading everything that is related to I18n ?
Changing the files to :
# test/unit/my_model_test.rb
require 'test_helper'
class MyModelTest < ActiveSupport::TestCase
test "the truth" {raise I18n.available_locales.inspect}
end
# app/models/my_model.rb
class MyModel < ActiveRecord::Base
end
shows that after everything is loaded in test environment, locales are again properly returned:
ruby -Ilib:test test/unit/my_model_test.rb
Loaded suite test/unit/my_model_test
Started
E
Finished in 0.018779 seconds.
1) Error:
test_the_truth(MyModelTest):
RuntimeError: [:en, :pl]
test/unit/my_model_test.rb:6:in `block in <class:MyModelTest>'
Comments and changes to this ticket
-
Franco Catena November 18th, 2010 @ 01:00 PM
- Tag changed from testing environment, eager_loading, i18n, rails3, test to eager_loading, i18n, rails3
I have the same problem, the i18n configuration is not loaded consistently across environmets. I create a patch that fix this, is for the master branch, but can be easily implemented in the other 3.X branches (only 3 lines of code).
I hope this helps anyone with the same problem.
Regards.
-
Franco Catena November 18th, 2010 @ 01:04 PM
- Tag changed from eager_loading, i18n, rails3 to testing environment, eager_loading, i18n, rails3
Sorry, I accidentally delete the testing environment tag.
-
Robert Pankowecki November 18th, 2010 @ 01:10 PM
It is nice to have a fix and it would be even better to have a test for this so it will not change accidentally in the future.
-
Franco Catena November 18th, 2010 @ 09:13 PM
Yes, I am working on the tests and an improvement of this patch, because only works when you have cache_classes = true (I just notice that, so is better avoid using it for now).
-
Robert Pankowecki November 18th, 2010 @ 11:01 PM
Thanks for your time and paying attention to this bug. I really appreciate that.
-
Franco Catena November 23rd, 2010 @ 04:10 PM
OK, there I go again.
-
Short version: the patch fix this issue
-
Long version: the configuration of the i18n railtie was in the after_initialize callback of the Rails configuration hooks, they are called after the classes eager load proccess. In the current schema of callbacks this can not be fixed, so I add the after_configuration method to the Rails configuration hooks (just when finisher starts). I make 2 new tests in the i18n initializer tests for this and include the new hook in the hook's tests.
Is a messy explanation, I know =).
Regards.
-
-
Robert Pankowecki November 23rd, 2010 @ 05:02 PM
I wish I could test it but master branch is failing due to "Rack::Session::Abstract::SessionHash" when running
rails console
. -
Robert Pankowecki November 23rd, 2010 @ 05:02 PM
- Tag changed from testing environment, eager_loading, i18n, rails3 to testing environment, eager_loading, i18n, patch, rails3
-
Franco Catena November 23rd, 2010 @ 05:27 PM
Robert, I make one patch for the 3.0 stable branch (because this must be fixed in 3.0 too), I hope you can try this.
-
Robert Pankowecki November 24th, 2010 @ 08:41 AM
I checked the patch for 3.0-stable and it works ok for the case described in this ticket.
Thank you! -
Robert Pankowecki November 24th, 2010 @ 08:49 AM
- Tag changed from testing environment, eager_loading, i18n, patch, rails3 to testing environment, cache_classes, eager_loading, i18n, patch, rails3
-
Franco Catena November 24th, 2010 @ 11:51 AM
- Tag changed from testing environment, cache_classes, eager_loading, i18n, patch, rails3 to testing environment, cache_classes, eager_loading, i18n, patch, rails3, railties, verified
OK, thank you for the confirmations, I will update the tags to add verified and railties.
-
Franco Catena November 24th, 2010 @ 11:53 AM
- Tag changed from testing environment, cache_classes, eager_loading, i18n, patch, rails3, railties, verified to testing environment, cache_classes, eager_loading, i18n, patch, rails3, railties
Ops I don't read well, It sais 3 people, tag verified removed
-
Franco Catena November 25th, 2010 @ 11:38 AM
- Tag changed from testing environment, cache_classes, eager_loading, i18n, patch, rails3, railties to testing environment, cache_classes, eager_loading, i18n, patch, rails3, railties, verified
-
tbh February 7th, 2011 @ 01:03 PM
Is #6353 about the same issue as this ticket? In case one wants to coordinate the patches...
-
José Valim February 7th, 2011 @ 01:09 PM
- State changed from new to duplicate
- Importance changed from to Low
Fixed on #6353.
-
Franco Catena February 7th, 2011 @ 01:19 PM
It is a shame, I do not know what is wrong with this path, why the one in #6353 was accepted and this is not.
Create your profile
Help contribute to this project by taking a few moments to create your personal profile. Create your profile »
<h2 style="font-size: 14px">Tickets have moved to Github</h2>
The new ticket tracker is available at <a href="https://github.com/rails/rails/issues">https://github.com/rails/rails/issues</a>
People watching this ticket
Attachments
Referenced by
- 6353 I18n load path needs to be setup before eager loading Isn't this a duplicate of #5522 ?