升级Rails 6.1.6.1触发Psych::DisallowedClass: Symbol加载错误如何解决?
报错根因
Rails 6.1 版本默认启用了YAML反序列化类白名单校验,底层依赖的Psych解析器仅允许加载预设的少数基础类型,Symbol未被纳入默认白名单。当ActiveRecord的Hash类型序列化字段中存储了Symbol类型的键或值时,从数据库读取记录触发反序列化就会抛出Psych::DisallowedClass异常。
可选修复方案
- 单字段定向放行
修改对应模型的序列化配置,通过permitted_classes参数显式声明该字段允许反序列化的类,将Symbol加入允许列表:
该方案影响范围最小,仅针对单个字段生效,配置完成后存量数据可直接正常读取。# 对应模型文件内 serialize :parameters, Hash, permitted_classes: [Symbol] - 全局白名单配置
如果项目内存在多个使用Symbol的序列化字段,可直接配置全局允许类列表,在config/application.rb内添加如下配置:
列表内可根据项目实际序列化用到的类型灵活增减。config.active_record.yaml_column_permitted_classes = [ Symbol, Hash, Array, String, Integer, Float, TrueClass, FalseClass, NilClass, Date, Time ] - 长期兼容优化
Symbol类型不会被Ruby垃圾回收机制回收,大量将Symbol作为持久化存储的键值存在内存泄漏隐患,长期维护更推荐将序列化字段类型改为HashWithIndifferentAccess:
该类型会自动将Hash键转为字符串存储,读取时同时支持字符串、符号形式的键取值,兼容性更强,也不会触发Psych的类校验拦截。serialize :parameters, HashWithIndifferentAccess
内容的提问来源于stack exchange,提问作者mrstif
相关产品推荐
相关产品推荐

