You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级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:
    serialize :parameters, HashWithIndifferentAccess
    
    该类型会自动将Hash键转为字符串存储,读取时同时支持字符串、符号形式的键取值,兼容性更强,也不会触发Psych的类校验拦截。

内容的提问来源于stack exchange,提问作者mrstif

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 13:15:40