Rails 7+Devise无法删除用户账号:link_to改button_to生效原因
问题原因分析
link_to 依赖UJS才能触发DELETE请求
Rails里用link_to发送DELETE这类非GET/POST的请求时,只会生成带data-method="delete"属性的<a>标签。这个标签本身只能发起GET请求,必须靠Rails内置的UJS(非侵入式JavaScript)脚本拦截点击事件,把请求转换成DELETE方法。如果你的页面没加载UJS脚本(比如Rails 6+没引入turbo-rails、旧版本没引入rails-ujs),或者脚本加载失败、有JS冲突导致UJS失效,点击链接就会发起普通GET请求。而Devise的user_registration_path的GET路由,在用户已登录时默认会重定向到/users,这就是你看到的情况。button_to 无需JS就能实现DELETE请求
button_to会直接生成一个完整的<form>表单,表单用POST方法提交,同时自动添加_method="delete"的隐藏字段。Rails后端会识别这个隐藏字段,把请求当作DELETE处理,整个过程不需要依赖JS,所以功能正常。
额外排查点
- 检查页面源码里的link标签是否包含
data-method="delete"属性 - 确认项目是否正确引入了UJS相关脚本(比如
turbo-rails或rails-ujs) - 再次检查浏览器控制台是否有隐性的JS报错(比如脚本加载失败的提示)
内容的提问来源于stack exchange,提问作者Wordica
相关产品推荐
相关产品推荐

