从 turbo_frame_tag 内部处理的 GET 请求变成了 HTML 而不是 TURBO_STREAM。

7

我开始接触hotwire/turbo并已经设置好了一切。 Turbo流已经正常工作。

在index.html.erb中:

<h1>Tasks</h1>
<%= turbo_stream_from "tasks" %>

<div id="tasks">
  <% @tasks.each do |task| %>
    <%= render task %>
  <% end %>
</div>

_task.html.erb 文件内部

<%= turbo_frame_tag dom_id(task) do %>
  <%= link_to 'Edit', edit_task_path(task) %>
  <%= link_to 'Destroy', task, method: :delete, data: { confirm: 'Are you sure?' } %>
  <hr>
<% end %>

当按下预期的销毁按钮时,Rails控制台会显示:
Started DELETE "/tasks/41" for ::1 at 2021-12-14 18:40:32 +0000
Processing by TasksController#destroy as TURBO_STREAM

但当点击编辑按钮时,Rails控制台显示:

Started GET "/tasks/41/edit" for ::1 at 2021-12-14 18:41:29 +0000
Processing by TasksController#edit as HTML

这意味着页面加载一个新的页面,呈现edit.html.erb而不仅仅是更新turbo_frame_tag内的内容。
在检查DOM时,编辑和删除链接都在turbo-frame中。
<turbo-frame id="task_41">
  <a href="/tasks/41/edit">Edit</a>
  <a data-confirm="Are you sure?" rel="nofollow" data-method="delete" href="/tasks/41">Destroy</a>
  <hr>
</turbo-frame> 

所以我的问题是,为什么请求会被处理为 HTML 而不是 TURBO_STREAM?
edit.html.erb 的代码如下:
<h1>Editing Task</h1>
<%= turbo_frame_tag dom_id(@task) do %>
    <%= render 'form', task: @task %>
<% end %>
<%= link_to 'Show', @task %> |
<%= link_to 'Back', tasks_path %>

非常感谢!

2个回答

1
解决方案:
在 application.js 文件中,我仍然有以下这行代码:
require("turbolinks").start()

我移除了这个,问题得到了解决。


0

我也遇到了同样的问题,但我的应用程序中没有require("turbolinks").start()这一行可以删除。

此外,我担心当删除该行时,每个其他的link_to都将被处理为turbo_stream在应用程序开发的任何阶段,都需要一个像HTML一样工作的link_to


2
你也可以尝试在 link_to 标签中添加 method: :get。我知道它们已经是 get 方法,但这个技巧对我很有效。 - Dan Tappin
1
我发现我需要在我的application.js文件中添加import Rails from "@rails/ujs"和Rails.start(),以便使用turbo_stream进行get请求时链接能够正常工作。记得要运行yarn add @rails/ujs。 - chell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接