在Sinatra中使用PaperTrail的reify方法时遭遇Psych::DisallowedClass异常
解决PaperTrail reify时的Psych::DisallowedClass (Time类)错误
方案1:全局配置PaperTrail允许Time类
在Sinatra项目的配置代码中(比如app.rb的configure块,或者单独的初始化文件),添加PaperTrail序列化器的白名单配置:
# 初始化PaperTrail并指定序列化器 PaperTrail.config do |config| config.serializer = PaperTrail::Serializers::YAML end # 给YAML序列化器添加允许的Time类 PaperTrail::Serializers::YAML.add_whitelisted_classes(Time)
该配置会全局生效,所有reify操作都能正常处理Time类型的字段。
方案2:调用reify时临时指定允许的类
如果不想全局修改配置,可在调用reify时通过serializer_options参数传入白名单,仅对当前操作生效:
version = item.versions[index] # 仅当前reify操作允许Time类反序列化 reified_model = version.reify(serializer_options: { permitted_classes: [Time] })
方案3:全局放宽Psych配置(不推荐)
若上述方案无效,可临时修改Psych的全局安全设置,但此方法会降低整个应用的YAML解析安全性,不建议用于生产环境:
# 全局允许Time类的反序列化 Psych::Whitelist.add(Time)
错误原因
Ruby 3.0及以上版本中,默认的YAML解析库Psych启用了严格安全模式,禁止反序列化未明确加入白名单的类。而PaperTrail 15.1.0的默认YAML序列化器未将Time类纳入白名单,因此还原历史版本时触发了安全限制。
内容的提问来源于stack exchange,提问作者xmarston
相关产品推荐
相关产品推荐

