升级Rails 6.1至Rails 7时遭遇NameError: uninitialized constant错误求助
Rails 6.1升级到7执行
bin/rails app:update时的NameError解决 问题场景
执行bin/rails app:update升级到Rails7时,出现如下错误:
Overwrite /my_app/bin/setup? (enter "h" for help) [Ynaqdhm] n skip bin/setup rails active_storage:update rails aborted! NameError: uninitialized constant Mappings include Mappings::Model ^^^^^^^^ /my_app/config/initializers/wrap_parameters.rb:17:in `block in <main>' /my_app/config/initializers/wrap_parameters.rb:16:in `<main>' /my_app/config/environment.rb:5:in `<main>' Tasks: TOP => active_storage:update => environment
错误由config/initializers/wrap_parameters.rb中的这段代码触发:
ActiveSupport.on_load(:active_record) do include Mappings::Model end
已尝试在wrap_parameters.rb顶部添加require语句,但问题未解决。
解决方案
- 调整钩子执行时机:Rails7初始化流程有调整,
ActiveSupport.on_load(:active_record)的执行时机可能早于Mappings模块加载时间,换成更晚触发的:active_record_base钩子:ActiveSupport.on_load(:active_record_base) do include Mappings::Model end - 确保模块正确加载:如果
Mappings::Model是自定义模块,核对文件路径后用绝对路径require:
注意替换成你实际的模块文件路径。require Rails.root.join('app/models/concerns/mappings/model') ActiveSupport.on_load(:active_record) do include Mappings::Model end - 适配Zeitwerk自动加载规则:Rails7默认使用Zeitwerk作为自动加载器,需保证模块名和文件目录、命名严格对应。比如
Mappings::Model对应app/models/concerns/mappings/model.rb(目录和文件名均为小写),同时确认该目录在自动加载路径中:# config/application.rb config.autoload_paths << Rails.root.join('app/models/concerns')
内容的提问来源于stack exchange,提问作者TryingNewThings
相关产品推荐
相关产品推荐

