使用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
验证修复
完成上述修改后,重新启动服务器,再次尝试拖拽排序:
- 控制台不会再出现
MissingTemplate错误 binding.pry应该会正常触发(如果服务器在debug模式下)- 数据库中的
position字段会被正确更新,排序状态能够持久化
内容的提问来源于stack exchange,提问作者Umar Ghouse
相关产品推荐
相关产品推荐

