Rails不使用gem实现搜索功能却返回全部数据库数据如何解决
问题根因&修复方案
1. 参数名不匹配(核心问题)
你两个搜索表单的参数名不统一,同时controller取值和表单字段对应不上:
- 首页搜索表单用的字段名是
keyword,但controller中仅取params[:search],从首页提交搜索时params[:search]为空,直接触发Movie.all返回全部数据 - 搜索结果页的表单用的字段名是
search,但如果存在空字符串提交的情况也会返回全量数据
修复步骤:
统一所有搜索表单的字段名为search,同时controller添加参数回显逻辑:
- 修改首页表单的文本框:
<%= form.text_field :search, value: @search %>
- 修改controller的search方法:
def search @search = params[:search] @movies = Movie.search(@search) end
2. LIKE查询语法错误
你在rails console中测试的LIKE语句写法错误,占位符和参数的格式不对,正确的测试写法:
# 正确写法,问号作为占位符,搜索参数作为第二个参数传入 Movie.where("name LIKE ?", "%你要搜索的名称%")
如果使用PostgreSQL数据库,默认LIKE是大小写敏感的,关键词大小写不匹配时查不到结果,换成ILIKE即可忽略大小写:
修改model层的search方法:
class Movie < ApplicationRecord def self.search(search) # 用present?过滤nil和空字符串,避免空搜索返回全部数据 if search.present? # PostgreSQL用ILIKE,MySQL可以保留LIKE where("name ILIKE ?", "%#{search}%") else all end end end
3. 额外排查技巧
如果修改后还有问题,可以按下面的步骤定位:
- 查看
log/development.log中搜索请求生成的SQL语句,确认WHERE条件是否符合预期 - 在controller的search方法中添加
puts params.inspect,查看控制台打印的请求参数是否存在search字段,值是否正确 - 执行
rails routes | grep search确认搜索路由名称正确,表单提交的search_path能正确映射到movies#search方法
内容的提问来源于stack exchange,提问作者Beginner Professional
相关产品推荐
相关产品推荐

