Rails 7 - 使用方法的 link_to :delete 仍然执行 GET 请求

Nil*_*ils 63 ruby-on-rails devise

我正在尝试让此链接正常工作,执行一个DELETE请求:

<%= link_to "Sign Out", destroy_user_session_path, method: :delete %>
Run Code Online (Sandbox Code Playgroud)

但是,当我单击它时,我的浏览器仍然执行请求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"
Run Code Online (Sandbox Code Playgroud)

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

Nil*_*ils 69

正如这里所建议的,以下内容就足够了:

<%= link_to "Sign Out", destroy_user_session_path, data: { "turbo-method": :delete } %>
Run Code Online (Sandbox Code Playgroud)

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

  • @imarg :如果您的“&lt;form&gt;”(或另一个父元素,例如“&lt;div&gt;”)具有“data: {turbo: false }”,那么您还需要将“turbo: true”添加到您的“link_to” `,结果是:`&lt;%= link_to "Sign Out", destroy_user_session_path, data: { Turbo: true, Turbo_method: :delete } %&gt;` (2认同)

ins*_*ero 55

在 Rails 7 中(至少)有两种删除某些内容的方法:

使用button_to(恕我直言,首选):

<%= button_to 'Sign Out', destroy_user_session_path, method: :delete %>
Run Code Online (Sandbox Code Playgroud)

呈现一个 HTML 表单,该表单发送POST带有“删除”值的隐藏_method属性的请求。Rails 会将其视为有一个DELETE方法(并将其路由到products#destroy或您的路由所说的任何内容)。不要在另一种表单中使用此表单(HTML禁止一种表单在另一种表单中使用)。

使用link_to

<%= link_to 'Sign Out', destroy_user_session_path, data: {turbo_method: :delete} %>
Run Code Online (Sandbox Code Playgroud)

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

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

确认

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

<%= button_to 'Sign Out', destroy_user_session_path, method: :delete,
  form: {data: {turbo_confirm: 'Are you sure?'}} %>
Run Code Online (Sandbox Code Playgroud)

如果您想向上面的链接添加确认:

<%= link_to 'Sign Out', destroy_user_session_path,
  data: {turbo_method: :delete, turbo_confirm: 'Are you sure?'} %>
Run Code Online (Sandbox Code Playgroud)


Pav*_*r V 10

在git上找到的

运行这些命令

这对我有用。

$ rails importmap:install
$ rails turbo:install stimulus:install
Run Code Online (Sandbox Code Playgroud)