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
相关产品推荐
相关产品推荐

