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?'} %>
我正在尝试让这个 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?'} %>