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
相关产品推荐
相关产品推荐

