Ruby on Rails中link_to销毁请求失效但button_to功能正常如何解决?
故障原因
你的问题核心是 UJS未正确加载,直接导致link_to的method: :delete逻辑不生效,完全符合你描述的表现:
button_to不需要UJS支持:它默认生成原生表单,内置隐藏的_method=delete字段,Rails会自动识别为DELETE请求,所以始终正常。link_to的非GET请求完全依赖UJS拦截点击事件伪造请求,UJS加载失败时就会走默认GET跳转,命中show动作。
导致UJS未加载的直接原因是你混用了Sprockets和Webpacker的资源导入语法:
你用的是Rails 6+的Webpacker打包方案,但application.js里写的//= require jquery、//= require jquery_ujs是旧版Sprockets资产管道的导入指令,Webpacker完全不识别,所以jquery_ujs根本没有被打包加载。而且Rails 5.1之后官方推出的@rails/ujs已经完全替代了jquery_ujs,不需要依赖jQuery,你已经在代码里导入了@rails/ujs,额外引入jquery_ujs属于冗余操作。
修复步骤
- 清理
application.js中的无效代码,删掉这两行:
//= require jquery //= require jquery_ujs
如果确实需要jQuery支持,要通过yarn安装依赖后用import语法导入,不要用Sprockets的//= require指令。
- 检查布局文件
app/views/layouts/application.html.erb,确认Webpacker资源引用正确,必须使用javascript_pack_tag而不是旧版的javascript_include_tag:
<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
- 清理资产缓存后重启服务:
rails assets:clobber # 开发环境直接重启Rails服务即可,生产环境需重新执行webpacker编译
- 验证UJS加载状态:打开浏览器控制台输入
Rails,如果返回UJS对象则加载成功,此时link_to的删除功能即可正常使用。
内容的提问来源于stack exchange,提问作者TTOVARISCHH
相关产品推荐
相关产品推荐

