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

Heroku环境下Devise的destroy_user_session_path登出异常问题

解决Heroku上Devise登出链接被转为GET请求的问题

我之前也碰到过一模一样的坑!Devise的登出请求在Heroku生产环境自动变成GET,加了no_turbolink参数也不管用,给你几个亲测有效的解决方案:

1. 确认Rails UJS(或Turbo)正确加载并编译

Devise的method: :delete依赖Rails提供的UJS(Unobtrusive JavaScript)来把GET请求转换成DELETE请求,先检查这几点:

  • 如果你用的是Rails 5-6:确保app/assets/javascripts/application.js里有//= require rails-ujs,而且这个语句要放在其他脚本之前。
  • 如果你用的是Rails 7+:Rails默认用Turbo代替了Turbolinks,需要确保app/javascript/application.js里导入了Turbo,并且给链接加上data: { turbo_method: :delete, turbo: false }参数,比如:
    <%= link_to 'Logout', destroy_user_session_path, data: { turbo_method: :delete, turbo: false } %>
    
  • 部署前务必运行rails assets:precompile,然后再推送到Heroku,否则生产环境可能没有最新的编译后的JS文件,导致UJS/Turbo失效。

button_to会自动生成一个包含隐藏_method字段的表单,通过POST请求模拟DELETE,不需要依赖前端JS,稳定性更高:

<%= button_to 'Logout', destroy_user_session_path, method: :delete, class: 'your-link-style-class' %>

如果需要让按钮看起来像链接,只需要加对应的CSS样式就行。

3. 临时允许Devise接受GET登出(不推荐长期使用)

如果以上方法都没解决,应急情况下可以修改Devise的配置,让它接受GET请求登出:
打开config/initializers/devise.rb,添加或修改这一行:

config.sign_out_via = :get

⚠️ 注意:这种方式有安全风险,恶意网站可以通过诱导用户点击链接来登出你的账号,只建议临时调试用,找到根本问题后一定要改回去。

如果你之前用的是Turbolinks(Rails 5-6),即使加了data: { no_turbolink: true },也可能因为Turbolinks的缓存机制导致问题,试试:

  • 在整个布局文件中临时禁用Turbolinks,比如去掉<head>里的data-turbolinks-track属性,测试是否解决问题。
  • 确保Turbolinks版本和你的Rails版本兼容,过时的版本可能会有奇怪的冲突。

内容的提问来源于stack exchange,提问作者kart-able

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:15:53