Rails 6部署Heroku遇NameError: uninitialized constant Rack::Cors
问题成因
报错NameError: uninitialized constant Rack::Cors的核心原因是生产环境没有加载rack-cors gem,Rails执行CORS初始化配置时找不到对应常量。
从Heroku构建日志可确认两个直接诱因:
- Gemfile中存在重复的
rack-cors、devise、devise-jwtgem声明,bundler依赖解析时可能出现异常 - 生产环境执行
bundle install(跳过了development、test分组)后,最终安装的57个依赖gem中完全没有rack-cors,说明该gem被错误放置到了非生产环境的分组中,或重复声明导致生产环境未被纳入安装范围。
修复步骤
- 清理Gemfile重复配置
打开项目根目录Gemfile,搜索所有rack-cors、devise、devise-jwt相关条目,每个gem仅保留1条声明,且rack-cors必须写在Gemfile顶层,不能包裹在group :development, :test do代码块内,参考写法:# 顶层声明,生产/开发/测试环境均会安装 gem 'rack-cors' gem 'devise' gem 'devise-jwt' - 更新依赖锁文件
在本地项目根目录执行命令,重新解析依赖并更新Gemfile.lock:
执行完成后确认输出中存在bundle installUsing rack-cors [版本号]的记录,即代表依赖解析正常。 - 本地验证生产构建流程
本地模拟生产环境执行资源预编译,确认不再抛出常量找不到的错误:RAILS_ENV=production bundle exec rake assets:precompile - 重新部署
将修改后的Gemfile、Gemfile.lock提交到Git仓库,重新推送到Heroku触发构建即可正常部署。
内容的提问来源于stack exchange,提问作者AbdUlRahman Shawareb
相关产品推荐
相关产品推荐

