RoR中针对Actor模型的Ransack搜索参数未生效问题求助
问题原因
你输出的params[:q]明确标注了permitted: false,Ransack默认会忽略所有未通过强参数校验的搜索条件,导致你提交的搜索参数完全没有被传入查询逻辑,所以最终生成的SQL没有WHERE子句,只会返回全量演员数据。
修复方案
在你的主页控制器中补充演员搜索的Ransack参数白名单即可,示例代码如下:
# 主页控制器代码 class HomeController < ApplicationController # 你原有的其他方法保留 def actorsearch # 把之前直接传params[:q]改成传白名单过滤后的参数 @q = Actor.ransack(actor_search_params) @actors_search = @q.result(distinct: true).includes(:movies, :actor_attributes) # 你原有的渲染逻辑保留 end private # 新增演员搜索参数白名单 def actor_search_params # 注意多选字段需要单独声明为数组类型 params.fetch(:q, {}).permit( :display_name_cont, :gender_eq, :born_gteq, :born_lteq, :rating_gteq, actor_attributes_id_in: [], movies_id_in: [] ) end end
额外注意事项
你的表单里有一处标签和字段不匹配的问题::movies_id_eq标签对应的实际提交字段是movies_id_in,该问题不影响搜索功能,仅会导致点击标签时无法正确聚焦到对应的下拉选择框,可以按需修改。
内容的提问来源于stack exchange,提问作者tkhobbes
相关产品推荐
相关产品推荐

