应用搜索仅首页可用,翻页报错: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
相关产品推荐
相关产品推荐

