表单回复必须使用 link_to 重定向到另一个位置

Form responses must redirect to another location with link_to

我正在使用 rails 6.1.x with hotwire-rails

想知道您是否有过以下经历:

我有一个页面 link_to 是这样的:

<%= link_to client_luser_courses_path,
{
  method: :get,
  class: "btn btn-primary text-center float-right",
  data: {turbo: false}
 } do %>
 <i class="fa fa-arrow-right" aria-hidden="true"></i>Get the files:
 <% end %>

在页面顶部,我启用了 turbo:

<%= javascript_pack_tag 'client', 'data-turbo-track': 'reload' %>

现在,如果我单击 link,我会收到错误消息:

Firefox 控制台中的“错误:表单响应必须重定向到另一个位置”

什么也没发生。

如果我删除“method::get”部分,那么它工作正常。

 <%= link_to client_luser_courses_path,
    {
      class: "btn btn-primary text-center float-right",
      data: {turbo: false}
     } do %>
     <i class="fa fa-arrow-right" aria-hidden="true"></i>Get the files:
     <% end %>

你知道为什么会这样吗?真是百思不得其解。

只是为了充实评论中的信息,特别是因为 Hotwire/Turbo 中的 link 似乎有很多混淆:

  1. 如果您希望 link 具有“默认”行为(意味着您需要一个新页面/整个页面重新加载),OP 是正确的 data: { turbo: false } 在 link.

    上声明
  2. 评论者 max 是正确的,添加 method: :get 并不是使 link 以这种方式运行的必要条件。然而,需要注意的是,失败的原因是添加一个 method 参数 实际上使 link 发送一个 POST 请求 ,带有名称为“_method”和值为“get”的隐藏输入。请参阅 the Rails API docs 中的 link_to

  3. OP看到的错误信息实际上是一个Turbo错误。目前还不清楚这是否是一个错误,因为 Turbo 应该被停用。应该是网络请求成功了,但是没有重定向,因为Turbo已经接管了。失败最终发生的原因是因为 Turbo 正在(错误地?)处理请求,并期望 30x 重定向,但没有发生重定向。这就是失败最终发生的原因。如果您在 DevTools 中打开网络检查器,您会看到一个 200 请求,其中包含您正在 link 访问的页面的预览。

TLDR:添加 method: :get 会使 link 发送 POST 请求,这可能是 Turbo 接管的原因,即使 OP 放入 data: { turbo: false }.