Heroku部署Rails应用报Psych无unsafe_load方法I18n错误如何解决?
问题产生原因
- 核心原因是Psych与i18n版本不兼容:Psych是Ruby官方的YAML解析库,
Psych.unsafe_load方法是3.3.2版本才新增的接口。你使用的i18n 1.8.10版本调整了YAML翻译文件的加载逻辑,默认调用unsafe_load方法,但你的Heroku环境使用Ruby 2.6,其内置的Psych版本低于3.3.2,不存在该方法,直接触发报错。 - 为什么没有用到I18n也会触发报错:Rails框架的ActiveSupport组件默认依赖I18n加载内置的多语言配置文件,也就是报错日志中提到的
activesupport-6.1.3.2/lib/active_support/locale/en.yml,该加载逻辑是Rails启动的内置流程,和你是否自行做国际化适配无关。 - 为什么本地正常仅Heroku报错:本地开发环境的Ruby版本更高,内置的Psych版本满足
i18n 1.8.10的依赖要求,因此不会触发问题,而Heroku线上的Ruby 2.6环境内置Psych版本偏低,刚好命中兼容性问题。
可行修复方案
- 最小改法:在Gemfile中锁定i18n到兼容的低版本,添加配置
gem 'i18n', '< 1.8.10',执行bundle install后重新部署到Heroku即可解决。 - 升级Ruby版本:将Heroku环境的Ruby版本升级到2.7及以上,高版本Ruby内置的Psych版本原生支持
unsafe_load方法,可彻底解决兼容性问题。 - 单独升级Psych:如果不想调整i18n和Ruby版本,可在Gemfile中添加
gem 'psych', '>= 3.3.2',强制指定Psych版本满足依赖要求,重新部署后也能生效。
内容的提问来源于stack exchange,提问作者Loïc Boset
相关产品推荐
相关产品推荐

