Rails删除当前登录用户关联所有任务时POST路由不匹配错误如何解决?
排查步骤
- 执行
rails routes | grep destroy_all命令,查看该路由对应的请求方法、绑定的控制器方法是否符合预期 - 查看Rails服务运行日志,确认点击删除按钮时发起的是POST类型的请求
- 检查控制器方法名、路由配置的action是否存在拼写错误
问题原因
- Rails内置的
button_to助手默认发送POST请求,但你在routes.rb中为destroy_all路径配置的是GET类型路由,请求方法不匹配触发路由报错 - 存在拼写不规范问题:控制器中方法名写为
all_destory,是destroy的拼写错误,虽然当前路由已绑定该名称暂时不影响运行,但后续迭代容易出现匹配错误
解决方法
方案1(推荐,符合REST规范)
修改路由配置为POST类型,同时修正拼写错误:
- 调整
routes.rb配置:
# 把GET改为POST,同时修正action的拼写 post '/tasks/destroy_all', to: 'task#all_destroy', as: :destroy_all
- 修正
task_controller.rb的方法名拼写:
class TaskController < ApplicationController # 把destory改为正确的destroy拼写 def all_destroy @user = current_user @user.tasks.destroy_all redirect_to user_tasks_path end end
删除操作属于修改服务端数据的行为,用POST请求符合HTTP规范,不会出现爬虫误爬、预加载误删数据的问题。
方案2(仅临时调试用)
如果暂时不想修改路由,可以给button_to指定请求方法为GET:
<%= button_to "delete all", destroy_all_path, method: :get %>
该方案不推荐用于生产环境,仅可用于临时验证功能。
修改完成后重启Rails服务,再次点击按钮即可正常触发批量删除逻辑。
内容的提问来源于stack exchange,提问作者smith
相关产品推荐
相关产品推荐

