You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails 7中Devise登出链接发送GET而非DELETE请求的问题求助

Rails 7 + Devise 登出链接发送GET而非DELETE请求的解决办法

问题回顾

在Rails 7应用中集成Devise后,使用以下代码生成的登出链接点击时,系统发送的是GET请求而非预期的DELETE请求:

<%= link_to "Logout", destroy_user_session_path, method: :delete, id: "logout-link" %>

已尝试执行yarn add @rails/ujs并在application.js中导入启动,但问题仍未解决。


具体解决步骤

1. 适配Rails 7的JavaScript加载方式

Rails 7默认使用Importmap而非Webpacker,若你用的是Importmap环境,无需通过yarn安装@rails/ujs,直接修改配置:

  • 在config/importmap.rb中添加:
    pin "@rails/ujs", to: "rails-ujs.js"
    
  • 确保app/javascript/application.js中代码正确:
    import Rails from "@rails/ujs"
    Rails.start()
    

2. 确认布局文件引入了JavaScript

检查app/views/layouts/application.html.erb,确保在</body>标签前包含对应环境的JavaScript标签:

  • Importmap环境:<%= javascript_importmap_tags %>
  • Webpacker环境:<%= javascript_pack_tag 'application' %>

3. 验证Devise路由正确性

运行rails routes命令,确认destroy_user_session路由对应DELETE方法:

DELETE /users/sign_out(.:format) users/sessions#destroy

若路由不存在或方法错误,需检查Devise的初始化配置是否正确。

4. 处理Turbo兼容性问题

Rails 7默认启用Turbo,它会拦截链接请求,可能干扰method: :delete的处理。可以直接在链接中添加data-turbo: false禁用Turbo拦截:

<%= link_to "Logout", destroy_user_session_path, method: :delete, id: "logout-link", data: { turbo: false } %>

5. 清除浏览器缓存

旧的缓存脚本可能导致代码不生效,强制刷新页面(Ctrl+F5)或清除浏览器缓存后重新测试。

6. 备选方案:使用button_to替代link_to

若以上方法均无效,可改用button_to,它会生成隐藏表单发送请求,无需依赖JavaScript:

<%= button_to "Logout", destroy_user_session_path, method: :delete, id: "logout-link", form_class: "inline" %>

通过form_class: "inline"可以让按钮样式更贴近链接的显示效果。


内容的提问来源于stack exchange,提问作者Varun Modi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 06:12:37