Ransack使用SpecialtyName_cont搜索时提示undefined method错误如何解决
问题根因
- 控制器调用ransack的模型不匹配:你需要搜索
Specialty模型的字段,但代码中调用的是GroupAssignment.ransack(params[:q]),Ransack只会在GroupAssignment的属性范围内匹配搜索键,自然找不到SpecialtyName相关的方法。 - Ransack默认会将驼峰命名的数据库字段自动转为蛇形匹配,即便你的
Specialty表字段是SpecialtyName,Ransack可识别的默认搜索键为蛇形格式的specialty_name_cont,不是你测试的几种写法。
修复步骤
- 修正控制器代码,将ransack调用对象替换为
Specialty模型:
# GET /specialties or /specialties.json def index @q = Specialty.ransack(params[:q]) @specialties = @q.result end
- 修正视图文件的搜索字段名,使用蛇形格式的搜索键:
<%= search_form_for @q do |f| %> <%= f.label :specialty_name_cont, '专业名称' %> <%= f.search_field :specialty_name_cont %> <%= f.submit %> <% end %>
- 可选配置:如果你需要保留驼峰格式的搜索键,可在
Specialty模型中新增如下配置,关闭Ransack的属性名自动转换规则:
class Specialty < ApplicationRecord # 原有ransackable_attributes配置 self.ransackable_attributes = ["id", "SpecialtyName", "created_at", "updated_at"] # 新增ransacker配置保留驼峰字段名 ransacker :SpecialtyName, type: :string do Arel.sql("SpecialtyName") end end
配置完成后即可继续使用SpecialtyName_cont作为搜索键。
内容的提问来源于stack exchange,提问作者Anonymous-ahole
相关产品推荐
相关产品推荐

