Ruby on Rails Destroy Action失效问题求助
Rails 7 删除资源失效问题排查与解决建议
问题描述
学习Ruby on Rails时,实现文章删除功能遇到问题:点击删除链接后页面仅刷新,无任何删除操作执行,推测问题与JavaScript相关。已参照官方指南开发,并搜索相关问题仍未解决。
环境版本
- Rails 7.0.4
- Ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-linux]
- Fedora 37 (Server Edition)
相关代码片段
app/controllers/articles_controller.rb
class ArticlesController < ApplicationController def show @article = Article.find(params[:id]) end def destroy @article = Article.find(params[:id]) @article.destroy flash[:success] = "The article has been destroyed." redirect_to articles_path, status: :see_other end end
config/routes.rb
Rails.application.routes.draw do resources :articles end
app/views/articles/show.html.erb(尝试过的多种删除链接写法)
<ul> <li> <%= link_to "Destroy", article_path(@article), data: { turbo_method: :delete, turbo_confirm: "Are you sure?" } %> </li> <li> <%= link_to "Delete", article_path(@article), :method => :delete %> </li> <li> <%= link_to "Defenestrate", article_path(@article), method: :delete %> </li> </ul>
已尝试的无效操作
- 在
app/views/layouts/application.html.erb中尝试引入旧版JS标签,触发资源不存在错误:
报错信息:<%= javascript_include_tag :defaults, 'data-turbolinks-track' => true %> <%= javascript_include_tag "defaults", 'data-turbolinks-track' => true %> <%= javascript_include_tag "application", 'data-turbolinks-track' => true %>Sprockets::Rails::Helper::AssetNotFound in Articles#show Showing app/views/layouts/application.html.erb where line #10 raised: The asset "defaults.js" is not present in the asset pipeline. - 添加
jquery-railsgem,并在app/assets/config/manifest.js引入jquery和jquery_ujs,问题未解决。
解决步骤
Rails 7 默认使用Turbo替代了传统的jquery_ujs,需遵循Turbo的规范配置:
确认Turbo集成状态
检查Gemfile是否包含:gem "turbo-rails"若缺失,执行
bundle add turbo-rails,再运行rails turbo:install完成自动配置。确保布局正确引入Turbo
在app/views/layouts/application.html.erb中保留正确的JavaScript标签(Rails 7默认使用Importmap):<%= javascript_importmap_tags %>使用Turbo规范的删除链接写法
仅保留基于Turbo的写法即可,旧版method: :delete是jquery_ujs规范,在Turbo环境下不生效:<%= link_to "Destroy", article_path(@article), data: { turbo_method: :delete, turbo_confirm: "Are you sure?" } %>验证请求与加载状态
- 打开浏览器开发者工具,查看Console是否有Turbo相关报错;
- 点击删除链接时,在Network标签中确认请求方法为
DELETE(而非GET); - 可在
destroy方法开头添加puts "Destroy method triggered",通过终端输出判断请求是否到达控制器。
内容的提问来源于stack exchange,提问作者ALittleHelpFromMyFriends
相关产品推荐
相关产品推荐

