Rails ActiveAdmin用户页出现Ransack::Search未定义`email_equals'错误
Rails + ActiveAdmin + Ransack 报错:undefined method `email_equals' for Ransack::Search实例
错误日志
ActionView::Template::Error (undefined method `email_equals' for an instance of Ransack::Search): 1: # frozen_string_literal: true 2: insert_tag renderer_for(:index) ransack (4.1.1) lib/ransack/search.rb:114:in `method_missing'
我的ActiveAdmin配置代码
ActiveAdmin.register User do index do id_column column :current_sign_in_at column :sign_in_count column :created_at end end
环境版本
- Rails Version: 7.1.2
- Ruby Version: 3.3.0
- ActiveAdmin Version: 3.2.0
- Ransack Version: 4.1.1
问题背景
修复「Ransack需要显式将模型关联加入白名单」的问题后,出现上述错误。
解决方法
方法1:在User模型中声明允许Ransack搜索的属性
Ransack 4.x版本开始要求显式声明可搜索的模型属性,ActiveAdmin默认会尝试搜索email字段,但该字段未被加入白名单,导致报错。在User模型中添加如下代码:
class User < ApplicationRecord # 保留原有代码,新增以下方法 def self.ransackable_attributes(auth_object = nil) # 若需要保留默认可搜索属性,用super追加email;也可明确列出所有允许的属性 super + ['email'] # 或者直接指定允许的属性:%w[id email current_sign_in_at sign_in_count created_at] end end
方法2:自定义ActiveAdmin的搜索过滤器(关闭默认email搜索)
如果不需要搜索email字段,可在ActiveAdmin配置中替换默认的搜索过滤器,只添加需要的字段:
ActiveAdmin.register User do # 移除默认的搜索过滤器,添加自定义项 filter :id filter :current_sign_in_at filter :sign_in_count filter :created_at index do id_column column :current_sign_in_at column :sign_in_count column :created_at end end
内容的提问来源于stack exchange,提问作者IshAsh
相关产品推荐
相关产品推荐

