【问题标题】:Rails 7 - link_to with method :delete still performs GET requestRails 7 - 带有方法的link_to :delete 仍然执行GET请求
【发布时间】:2021-12-24 15:33:02
【问题描述】:

我正在尝试使此链接正常工作,执行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"

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

【问题讨论】:

  • 我没用过hotwired,但是把method: :delete改成data: { turbo_method: :delete }有用吗?
  • 是的,这对我有用,谢谢 :) 只有一件奇怪的事情:一旦执行了 DELETE 请求,我的浏览器就会被重定向(根据需要),但不是执行正常的 GET,而是执行另一个DELETE(在我的情况下是“/”)。用户没有注意到它,它只是显示在网络控制台中。
  • 检查这个 github 问题,特别是这个comment 也许destroy_user_session_path 并且不指定删除方法会触发两次请求......

标签: ruby-on-rails devise


【解决方案1】:

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

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

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

【讨论】:

  • 我几天前在我的项目中尝试过这个,我可以发誓它工作正常。但是现在当我尝试这个时它不起作用。
  • 您能发布您正在使用的 Rails 和设计的版本吗?
  • 如果您将它放在表单中,这将不起作用,因为它会创建另一个隐藏表单。更好的方法是使用button_to,如文档中所述。 turbo.hotwired.dev/handbook/…
  • button_to 也会创建一个表单。
  • 嘿@Nils,刚刚看到你的评论。正如我所说,我试过这个,它确实有效。然后由于某种原因它没有,我沮丧地四处寻找并在这里留下了我的评论。然后,过了一会儿,它又起作用了。我不知道我做错了什么,发生了什么变化,但我很高兴它确实有效并且完全忘记了我留下的评论。
【解决方案2】:

(至少)有两种方法可以在 rails 7 中删除某些内容:

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

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

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

使用link_to:

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

使用data-turbo-method 属性呈现一个简单的a 标记。此链接发送 真实 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_to 'Sign Out', destroy_user_session_path,
  data: {turbo_method: :delete, turbo_confirm: 'Are you sure?'} %>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 2011-11-19
    • 2015-08-16
    • 2015-12-12
    • 2018-04-27
    • 1970-01-01
    相关资源
    最近更新 更多