Ruby on Rails无法触发destroy动作:点击Destroy执行show问题求助
问题分析与解决方法
核心问题
点击Destroy链接时触发了GET /articles/5(对应ArticlesController#show动作),而非预期的DELETE请求,说明Turbo未正确拦截链接并转换请求方法。
排查与解决步骤
1. 确认Turbo正确加载
Rails 7默认集成Turbo,但如果前端资源未正确引入,data-turbo-method属性不会生效:
- 检查
app/javascript/application.js是否包含Turbo导入:import "@hotwired/turbo-rails" - 重启Rails服务器,确保前端资源重新编译。
2. 验证链接HTML渲染结果
查看页面源码,确认Destroy链接的属性是否正确生成:
<a data-turbo-confirm="Are you sure?" data-turbo-method="delete" href="/articles/5">Destroy</a>
若属性缺失,检查link_to代码的拼写(比如turbo_method是否写错,Rails会自动将哈希键转为连字符格式)。
3. 清除浏览器缓存或使用无痕模式
旧的前端资源缓存可能导致Turbo未加载,清除缓存后重试,或直接用无痕模式测试。同时检查浏览器控制台是否有Turbo相关的加载报错(如404找不到JS文件)。
4. 备选方案:改用button_to
如果Turbo仍不生效,可使用button_to生成表单提交(无需依赖Turbo,是Rails传统删除方式):
<li><%= button_to "Destroy", article_path(@article), method: :delete, data: { confirm: "Are you sure?" } %></li>
button_to会自动生成隐藏表单,提交DELETE请求,兼容性更稳定。
5. 确认路由配置有效性
运行rails routes命令,确认输出中存在destroy路由:
DELETE /articles/:id(.:format) articles#destroy
你的routes.rb中resources :articles已正确生成该路由,此步骤主要用于排除路由配置错误。
额外检查点
- 清理控制器中无关注释:比如
destroy方法里的葡萄牙语注释# Adicione esta linha,避免潜在干扰(不影响功能,但建议保持代码整洁)。 - 排查是否有自定义JS代码阻止了链接的默认行为,比如事件监听器覆盖了Turbo的处理逻辑。
内容的提问来源于stack exchange,提问作者Pedro Diogo
相关产品推荐
相关产品推荐

