Rails7安装UJS后删除按钮触发Get请求而非Destroy请求的解决
Rails7中UJS配置问题导致Delete链接触发GET请求的解决办法
以下是针对问题的具体排查和解决步骤:
确认UJS正确安装并引入
Rails7默认使用Importmap管理JS依赖,需确保rails-ujs已正确配置:- 在
config/importmap.rb中添加:pin "rails-ujs", to: "rails-ujs.js" - 在
app/javascript/application.js中导入UJS:import "rails-ujs" - 确保布局文件(如
app/views/layouts/application.html.erb)中加载了JS入口文件,比如包含<%= javascript_importmap_tags %>。
- 在
处理Turbo与UJS的冲突
Rails7默认集成Turbo,它会拦截链接请求并可能覆盖UJS的行为。解决方式二选一:- 给Delete链接添加
data: { turbo: false },禁用Turbo对该链接的处理,修改后的代码:<%= link_to "Delete", employee_path(employee), method: :delete, class: "btn btn-danger", data: { confirm: "Are You sure to delete this employee", turbo: false } %> - 若无需Turbo,可在
app/javascript/application.js中移除import "@hotwired/turbo-rails",或在布局中全局禁用Turbo。
- 给Delete链接添加
验证CSRF令牌存在
布局文件中必须包含<%= csrf_meta_tags %>,UJS需要该令牌来生成符合要求的DELETE请求头,缺少它会导致请求被降级为GET。检查浏览器控制台错误
打开浏览器开发者工具的Console面板,查看是否有UJS加载失败或执行报错的信息,JS运行异常会导致UJS无法将GET请求转换为DELETE请求。
你的控制器destroy动作代码逻辑是正确的,问题主要出在前端UJS的配置或与Turbo的兼容性上。
内容的提问来源于stack exchange,提问作者Afaq Shahid Khan
相关产品推荐
相关产品推荐

