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

升级Ransack至4.0.0遇ActionText::RichText白名单配置问题

解决Ransack 4.0升级中ActionText::RichText的属性白名单问题

问题背景

升级Ransack到4.0.0版本后,所有模型必须显式定义ransackable_attributes来指定可搜索属性。自定义模型已完成配置修复,但遇到ActionText::RichText的报错,提示需为该类配置可搜索属性。尝试过两种方案均失败:

  • 在app/models/action_text/rich_text.rb重新定义类,修改未被系统识别
  • 在初始化器中重新继承ActiveRecord::Base定义方法,触发has_many_attached方法不存在的错误

错误原因分析

  • 方案1失败原因:通过class ActionText::RichText < ApplicationRecord重新定义类,会覆盖Rails内置的ActionText::RichText类,同时丢失原类的所有配置(如Active Storage关联),再加上Rails加载顺序问题,最终自定义修改被内置类覆盖。
  • 方案2失败原因:手动指定继承ActiveRecord::Base,但原ActionText::RichText实际继承自ApplicationRecord并包含Active Storage模块,重新继承会丢失这些依赖,导致has_many_attached方法缺失。

可行解决方案

方案一:在app/models目录下打开现有类

创建app/models/action_text/rich_text.rb,不要重新指定父类,直接打开现有类添加方法:

# app/models/action_text/rich_text.rb
class ActionText::RichText
  def self.ransackable_attributes(auth_object = nil)
    ["body", "created_at", "id", "locale", "name", "record_id", "record_type", "updated_at"]
  end
end

Rails默认会加载app/models下的所有文件(包括子目录),重启服务器后修改即可生效。

方案二:在初始化器中用class_eval扩展类

创建或修改初始化器文件(如config/initializers/ransack_action_text.rb),使用class_eval安全扩展现有类:

# config/initializers/ransack_action_text.rb
ActionText::RichText.class_eval do
  def self.ransackable_attributes(auth_object = nil)
    ["body", "created_at", "id", "locale", "name", "record_id", "record_type", "updated_at"]
  end
end

这种方式不会改变原类的继承关系和已有配置,能确保富文本附件等原有功能不受影响。

验证方法

重启Rails服务器后,尝试触发涉及ActionText::RichText的搜索操作,确认不再出现Ransack属性白名单报错,同时检查富文本附件上传、展示功能是否正常(验证has_many_attached未受影响)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 07:00:03