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

Ruby on Rails中PostsController#show出现Psych::DisallowedClass错误求助

Ruby on Rails项目PostsController#show触发Psych::DisallowedClass错误的问题

问题详情

  • 在PostsController#show动作中遇到Psych::DisallowedClass错误,首次碰到该问题,怀疑是RoR环境配置问题而非代码问题
  • 疑问:错误提示中的‘klassname’为何不是‘classname’?

错误截图:
错误截图

项目Gemfile内容

source 'https://rubygems.org'

ruby '2.7.1'

git_source(:github) do |repo_name|
  repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
  "https://github.com/#{repo_name}.git"
end

# 手动安装的gem
gem 'aws-sdk-s3'
gem 'bootsnap', require: false
gem 'simple_form'
gem 'friendly_id', '~> 5.1.0'
gem 'devise'
gem 'will_paginate', '~> 3.1.0'
gem 'meta-tags'
gem 'omniauth'
gem "omniauth-rails_csrf_protection", "~> 1.0"
gem 'omniauth-twitter'
gem 'impressionist', '~>1.6.1'
gem 'gibbon'
gem 'acts_as_votable', '~> 0.11.1'
gem 'awesome_print'
gem 'sanitize'
gem "mini_magick"
gem "redcarpet"
gem 'file_validators'
gem 'pg_search'
gem 'invisible_captcha'
gem "recaptcha"

# 绑定稳定版Rails,如需尝鲜可替换为github版本
gem 'rails', '~> 5.2'
# 使用PostgreSQL作为数据库
gem 'pg'
# 使用Puma作为应用服务器
gem 'puma', '~> 3.7'
# 使用SCSS编写样式
gem 'sass-rails', '~> 5.0'
# 使用Uglifier压缩JS资源
gem 'uglifier', '>= 1.3.0'
# 如需支持更多JS运行时可取消注释下面的gem
# gem 'therubyracer', platforms: :ruby

# 使用CoffeeScript处理.coffee文件
gem 'coffee-rails', '~> 4.2'
# 集成Turbolinks提升页面跳转速度
gem 'turbolinks', '~> 5'
# 使用jbuilder构建JSON接口
gem 'jbuilder', '~> 2.5'
# 如需在生产环境用Redis运行Action Cable可取消注释
# gem 'redis', '~> 3.0'
# 如需使用ActiveModel的has_secure_password可取消注释
# gem 'bcrypt', '~> 3.1.7'

# 如需使用Capistrano部署可取消注释
# gem 'capistrano-rails', group: :development

group :development, :test do
  # 调试工具,在代码中调用byebug进入调试控制台
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  # 集成Capybara系统测试和Selenium驱动
  gem 'capybara', '~> 2.13'
  gem 'selenium-webdriver'
end

group :development do
  # 异常页面或代码中调用<%= console %>可打开IRB控制台
  gem 'web-console', '>= 3.3.0'
  # 文件监听工具,用于自动重启应用
  gem 'listen', '>= 3.0.5', '< 3.2'
  # Spring后台运行应用提升开发速度
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
end

# Windows系统缺少时区文件,绑定tzinfo-data
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

gem 'mina'
gem 'elasticsearch-model'
gem 'elasticsearch-rails'

问题解答

1. Psych::DisallowedClass错误的解决方法

这个错误来自Ruby的YAML解析库Psych,是安全限制导致的:Ruby 2.7+版本中,Psych默认禁止反序列化未被允许的类,防止恶意YAML注入风险。Rails 5.2+的Active Record序列化机制依赖Psych,当你加载的Post记录包含序列化字段(比如用serialize :some_field声明的字段),且该字段存储的类不在允许列表中时,就会触发错误。

解决步骤:

  • 检查Post模型中是否有serialize声明的字段,确认字段对应的类
  • 如果是自定义类,在项目的config/initializers/psych.rb文件中添加允许类的配置:
    Psych.add_allowed_class(YourCustomClassName)
    
    如果是第三方库的类,也需要手动添加到允许列表
  • 替代方案:将序列化方式从YAML改为JSON,比如serialize :some_field, JSON,JSON没有类反序列化的安全风险

你的项目使用Ruby 2.7.1,刚好是Psych强化安全限制的版本,这是触发问题的核心原因,属于环境配置相关的兼容问题。

2. 关于‘klassname’的疑问

‘klassname’是Ruby社区的惯用写法,因为class是Ruby的关键字,直接用classname作为变量名或标识符可能会引发语法冲突,因此Ruby生态中的很多库(包括Psych)会用klass代替class,对应的klassname就是“类名”的意思,只是社区约定俗成的缩写,没有特殊语法意义。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 11:37:27