Defect #38155
closedRuntimeError when reloading Rails console
0%
Description
Hi!
When I start a Rails console in development and at some point run a reload! to reload changes I have just made to the source code, I get a RuntimeError:
> rails console
Loading development environment (Rails 6.1.7)
irb(main):001:0> reload!
Reloading...
Traceback (most recent call last):
7: from config/initializers/30-redmine.rb:11:in `block in <top (required)>'
6: from lib/redmine/preparation.rb:163:in `prepare'
5: from lib/redmine/menu_manager.rb:251:in `map'
4: from lib/redmine/preparation.rb:164:in `block in prepare'
3: from lib/redmine/menu_manager.rb:321:in `push'
2: from lib/redmine/menu_manager.rb:403:in `add'
1: from lib/redmine/menu_manager.rb:386:in `add_at'
RuntimeError (Child already added)
The source of the error is Redmine::Preparation.prepare, which is called in this to_prepare block in config/initializers/30-redmine.rb:
Rails.application.config.to_prepare do I18n.backend = Redmine::I18n::Backend.new # Forces I18n to load available locales from the backend I18n.config.available_locales = nil Redmine::Preparation.prepare end
The reason for the error is that Rails.application.reloader.reload! correctly runs the prepare callbacks twice, but Redmine::Preparation.prepare does not support being called multiple times.
From https://github.com/rails/rails/pull/28111#issuecomment-285370954:
We already call prepare a thoroughly variable number of times -- if your prepare handler isn't idempotent, you're going to have a bad time.
So I changed the classes used in Redmine::Preparation to be idempotent. Please see the attached patch.
Now reloading works:
Reloading... => true
Best regards,
Thomas
Files
Updated by Go MAEDA almost 3 years ago
- Tracker changed from Patch to Defect
- Status changed from New to Confirmed
Updated by Mischa The Evil almost 3 years ago
- Feature #14008 (Add a warning if 2 plugins have the same settings partial name);
- Protection against registering multiple wiki formatters with the same name.
This should be tested carefully before it is being committed.
Updated by Thomas Löber almost 3 years ago
- File Make_Redmine_preparation_idempotent_v2.patch Make_Redmine_preparation_idempotent_v2.patch added
You are absolutely right. I have added an updated patch. (I am not allowed to delete the first patch, though.)
Updated by Go MAEDA almost 2 years ago
- Target version set to 6.0.0
Setting the target version to 6.0.0.
Updated by Go MAEDA over 1 year ago
- Subject changed from Redmine 5: RuntimeError when reloading Rails console to RuntimeError when reloading Rails console
- Category set to Rails support
- Status changed from Confirmed to Closed
- Assignee set to Go MAEDA
- Resolution set to Fixed
Committed the patch in r22681. Thank you.