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

使用Rails.ajax与jQuery Sortable插件时遇ActionView::MissingTemplate错误

解决Rails中jQuery UI Sortable AJAX拖拽排序的500模板缺失错误

看起来你遇到的核心问题是AJAX请求触发了控制器的sort方法,但Rails找不到对应的模板文件,导致返回500错误,这也是数据库变更没生效的关键原因(请求因报错中断执行,或即使逻辑执行了也因响应错误无法确认结果)。让我们一步步排查解决:

问题根源分析

从你的控制台日志可以明确看到:

Processing by ContentsController#sort as */*
Parameters: {"content"=>["13", "4"]}
Completed 500 Internal Server Error in 29ms
ActionView::MissingTemplate (Missing template contents/sort, application/sort...)

Rails接收到的是JS格式的请求(formats=>[:js, :html]),当你的sort action没有明确指定返回的响应内容时,Rails会自动尝试寻找对应的模板文件(比如app/views/contents/sort.js.erb),但你没有创建这个文件,因此抛出了缺失模板的错误。

另外你提到binding.pry没触发,有可能是请求因为模板错误提前终止了执行,或者你的服务器没有运行在debug模式下(比如用rails server而非rails server --debugger启动)。

解决方案

方案1:在控制器action中明确返回无内容响应

修改你的sort方法,直接返回head :no_content(Rails 5+推荐用法),告诉Rails不需要渲染任何模板:

def sort
  binding.pry
  params[:content].each_with_index do |id, index|
    Content.where(id: id).update_all(position: index + 1)
  end
  head :no_content # 关键:明确返回无内容的成功响应
end

这个方法会让Rails返回204状态码,跳过模板查找步骤,同时保证你的排序逻辑完整执行。

方案2:修改AJAX请求的dataType

在CoffeeScript中,给Rails.ajax添加dataType: 'json',告诉服务器你期望JSON格式的响应,Rails就不会去寻找JS模板了:

document.addEventListener 'turbolinks:load', ->
  $('.sortable').sortable
    handle: '.handle'
    update: (e, ui) ->
      Rails.ajax
        url: $(this).data("url")
        type: "PATCH"
        data: $(this).sortable 'serialize'
        dataType: 'json' # 添加这一行指定响应格式
      return
  return

额外检查:确保路由配置正确

确认你的routes.rb中已经正确定义了sort的集合路由:

resources :contents do
  collection do
    patch :sort # 对应PATCH /contents/sort请求
  end
end

验证修复

完成上述修改后,重新启动服务器,再次尝试拖拽排序:

  1. 控制台不会再出现MissingTemplate错误
  2. binding.pry应该会正常触发(如果服务器在debug模式下)
  3. 数据库中的position字段会被正确更新,排序状态能够持久化

内容的提问来源于stack exchange,提问作者Umar Ghouse

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:38:31