rails: frozen_string_literal cause errors when zeitwerk enabled
Steps to reproduce
- Get the up-to-date rails:master code.
- Run some pieces of code, starting with a
# frozen_string_literal: true
line.- A sample-model, where I get errors for enums, and a sample-controller where I get errors for
layout: guest
line.
- A sample-model, where I get errors for enums, and a sample-controller where I get errors for
- App will throw
FrozenError (can't modify frozen #<Class:#<Array:0x0000560cb028f588>>):
in different parts of the application.
Actual behavior
After enabling zeitwerk
, the files starting with # frozen_string_literal: true
started to cause errors. More specifically I am getting lots of FrozenError (can't modify frozen #<Class:#<Array:0x0000560cb028f588>>):
errors.
When I disable zeitwerk by adding config.autoloader = :classic
to the application.rb, I’m not getting any errors.
When I don’t disable zeitwerk, but remove # frozen_string_literal: true
line, I’m not getting any errors too.
System configuration
Rails version: 6.0.0.beta1:master
Ruby version: 2.6.1p33 (2019-01-30 revision 66950) [x86_64-linux]
About this issue
- Original URL
- State: closed
- Created 5 years ago
- Reactions: 4
- Comments: 25 (19 by maintainers)
Commits related to this issue
- Depend on bootsnap 1.4.1 This is needed to fix #35278. — committed to rails/rails by rafaelfranca 5 years ago
OK, I think we have it.
bootsnap
has been updated and it is going to have a new release soon. Then, for extra peace of mind, merged the unhook in #35332 to remove AS::Dependencies’const_missing
altogether. With it we’ll bypass monkey patches to the private methods it invokes that may exist out there, as it was the case in the origin of these frozen errors.Thanks a lot you guys for testing
master
, without these tests this gotcha would have shipped with beta2. And thanks a lot for the debugging session here with all the tests and shared traces, it was really instrumental to identify what was happening. ❤️Well, fun times:
Add
config.autoloader = :classic
toapplication.rb
, restart server => error goes awaybut then
Remove
config.autoloader = :classic
fromapplication.rb
, restart server => error stays awaySo there’s some interaction beyond whether it’s in classic mode.