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

应用搜索仅首页可用,翻页报错:Couldn't find Vehicle with 'id'=search

解决搜索分页时的"Couldn't find Vehicle with 'id'=search"错误

这个问题的核心是路由匹配顺序和分页链接的目标路径出了问题,我来一步步帮你搞定:

1. 修正路由优先级

Rails的路由是从上到下匹配的,默认的resources :vehicles会生成GET /vehicles/:id的show动作路由。当你点击分页访问/vehicles/search?page=2时,Rails会把search当成:id参数,匹配到show动作,自然找不到id为search的车辆。

解决办法是把搜索路由放在resources :vehicles之前,确保Rails先匹配到搜索动作:

# config/routes.rb
get 'vehicles/search', to: 'vehicles#search'
resources :vehicles

2. 确保分页链接指向搜索动作并传递参数

默认的Kaminari分页链接会使用当前请求的路径,但如果不明确指定,可能还是会走错误的路由。同时要把搜索关键词传递到下一页,保证分页展示的还是搜索结果:
在你的视图(比如app/views/vehicles/search.html.erb)里修改分页代码:

<%= paginate @vehicles, 
             params: { search_string: params[:search_string] }, 
             url: vehicles_search_path %>

这样生成的分页链接会是/vehicles/search?search_string=你的关键词&page=2,既指向正确的搜索动作,又保留了搜索参数。

3. 修复控制器里的语法错误

你的控制器代码里有个小语法问题:vehicles.order:make是错误的写法,应该是调用order方法并传入:make参数,改成:

def search
  vehicles = Vehicle.fuzzy_search(params[:search_string])
  # 修正order的调用方式
  @vehicles = Kaminari.paginate_array(vehicles.order(:make)).page(params[:page]).per(3)

  if @vehicles.empty?
    flash.now[:alert] = "No records found - displaying all records ..."
    @vehicles = Vehicle.order(:make).page(params[:page]).per(3)
  end

  render :index # 这里原代码的render :ac应该是对应你要渲染的视图,比如首页的index视图
end

这样调整后,点击分页就不会再触发show动作,而是正确调用search动作,同时保留搜索参数,展示对应的分页结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:52:09