升级Ruby版本后Heroku部署Rails应用失败求助
Heroku部署Rails应用失败(Ruby升级到3.1.2后)解决方案
问题分析
部署时触发两个核心错误:
Rails couldn't infer whether you are using multiple databases from your database.yml and can't generate the tasks for the non-primary databases. If you'd like to use this feature, please simplify your ERB.Psych::BadAlias: Unknown alias: default
这两个问题均与Ruby 3.1.x的兼容性相关:Ruby 3.0+升级了Psych库,对YAML解析规则更严格;同时Rails对database.yml中的ERB复杂度判断标准更敏感。
解决方案
1. 简化database.yml的ERB逻辑
检查config/database.yml文件,移除复杂的ERB嵌套或动态生成逻辑,让Rails能清晰识别数据库配置结构:
- 删除不必要的条件判断、循环等ERB代码,仅保留生产环境(Heroku使用的环境)的明确配置项。
- 避免用ERB生成复杂的数据库连接参数,直接使用Heroku提供的
DATABASE_URL环境变量(Rails会自动读取该变量)。
2. 修复YAML别名引发的Psych错误
Ruby 3.0+的Psych库默认禁用了YAML别名(&定义别名、*引用别名的写法),若配置文件中使用了该写法,直接展开别名即可:
- 错误写法示例:
default: &default adapter: postgresql encoding: unicode production: <<: *default url: <%= ENV['DATABASE_URL'] %> - 修改后写法:
production: adapter: postgresql encoding: unicode url: <%= ENV['DATABASE_URL'] %>
3. 升级Webpacker版本
Webpacker 4.3.0与Ruby 3.1.x存在兼容性问题,建议升级到Webpacker 4.x的最新稳定版(如4.4.0),或直接升级到Webpacker 5.x(需确保你的Rails 6.0版本支持):
- 修改Gemfile:
gem 'webpacker', '~> 4.4' - 运行
bundle update webpacker,将更新后的Gemfile和Gemfile.lock提交到代码仓库。
4. 额外检查项
- 确认Gemfile中Ruby版本指定正确:
ruby '3.1.2' - 本地提前验证资产编译:运行
rake assets:precompile RAILS_ENV=production,提前发现编译错误。 - 清理Heroku缓存:执行
heroku repo:purge_cache后重新部署。
内容的提问来源于stack exchange,提问作者diego
相关产品推荐
相关产品推荐

