Rails 7 - link_to with method :delete 仍然执行 GET 请求

Rails 7 - link_to with method :delete still performs GET request

我正在尝试让这个 link 工作,执行 DELETE 请求:

<%= link_to "Sign Out", destroy_user_session_path, method: :delete %>

但是当我点击它时,我的浏览器仍然执行 GET 请求(由于明显的原因失败):

我已经阅读了多个其他论坛帖子,这可能与未包含 jquery 有关。他们提到你需要取消注释 app/javascript/application.js 中的一行,但我的是空的:

// Configure your import map in config/importmap.rb. Read more: https://github.com/rails/importmap-rails
import "@hotwired/turbo-rails"
import "controllers"

这些论坛帖子也很旧,所以我怀疑在此期间发生了一些变化。

按照建议here,以下就足够了:

<%= link_to "Sign Out", destroy_user_session_path, data: { "turbo-method": :delete } %>

我已经在我的项目中对此进行了测试,它似乎工作正常。还要感谢 @alexts,你基本上也明白了这一点,但是 GitHub 的评论甚至消除了双重请求。

有(至少)两种方法可以删除 rails 7:

中的内容

使用button_to(更喜欢恕我直言):

<%= button_to 'Sign Out', destroy_user_session_path, method: :delete %>

呈现一个 HTML 表单,该表单发送一个 POST 请求,其中隐藏的 _method 属性具有 'delete' 值。 Rails 会将其视为具有 DELETE 方法(并将其路由到 products#destroy 或您的路由所说的任何内容)。不要在另一种形式中使用这个(HTML forbids 一种形式在另一种形式中)。

使用link_to

<%= link_to 'Sign Out', destroy_user_session_path, data: {turbo_method: :delete} %>

呈现一个带有 data-turbo-method 属性的简单 a 标签。此 link 发送了一个 真实的 DELETE 请求。

如果您的 destroy 操作以 redirect_to 结尾,某些浏览器将使用 DELETE 方法重定向到新位置(导致错误),因此请务必添加 status: :see_other 参数到 redirect_to,就像指南 suggest.

确认

如果你想给上面的按钮添加确认提示:

<%= button_to 'Sign Out', destroy_user_session_path, method: :delete,
  form: {data: {turbo_confirm: 'Are you sure?'}} %>

如果您想对上面的 link 添加确认:

<%= link_to 'Sign Out', destroy_user_session_path,
  data: {turbo_method: :delete, turbo_confirm: 'Are you sure?'} %>