【问题标题】:Why does this link_to use GET rather than DELETE like I specified?为什么这个 link_to 使用 GET 而不是我指定的 DELETE?
【发布时间】:2020-07-30 12:39:11
【问题描述】:

我正在使用devise,这是我的链接:

<%= link_to "Logout", logout_path, method: :delete, class: "dropdown-item" %>

这是我点击链接时的日志输出:

Started GET "/logout" for ::1 at 2020-04-16 21:24:58 -0500
ActionController::RoutingError (No route matches [GET] "/logout"):

这是它生成的 HTML:

<a class="dropdown-item" rel="nofollow" data-method="delete" href="/logout">Logout</a>

这是我routes.rb的相关部分:

  devise_scope :user do
    delete "logout", to: "devise/sessions#destroy"
  end

【问题讨论】:

  • 控制台中是否有任何 javascript 错误?你试过这个:stackoverflow.com/a/22004078/4414956 吗?
  • 它作为 GET 请求发送的原因是某些东西阻止了 Rails UJS 声明的事件侦听器工作。这可能是您的 application.js 缺少 require("@rails/ujs").start() 或脚本错误。如果没有该事件侦听器,它只是一个普通的旧链接,浏览器通过发送 GET 请求来处理对链接的点击。对于像注销按钮这样重要的东西,我会考虑使用button_to 来强化您的应用程序,即使完全关闭 javascript 也可以使用。
  • @max 对延迟回复感到抱歉,但您关于使用 button_to 的建议很有效。其他链接不是很有帮助,但 button_to 的建议是完美的。谢谢!如果您将其添加为答案,我会接受。

标签: ruby-on-rails devise


【解决方案1】:

根据@max 对我上述问题的评论:

它作为 GET 请求发送的原因是某些东西是 防止 Rails UJS 声明的事件监听器工作。这 可能是您的 application.js 丢失了 require("@rails/ujs").start() 或脚本错误。没有那个事件 监听器它只是一个普通的旧链接,浏览器处理链接点击 通过发送 GET 请求。对于像注销这样重要的事情 button 我会考虑使用 button_to 来强化你的应用 即使 javascript 完全关闭,它仍然有效。

所以我将link_to 更改为button_to,效果非常棒。

【讨论】:

    猜你喜欢
    • 2013-09-29
    • 2010-10-21
    • 2016-03-12
    • 2019-06-30
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多