ruby-on-rails - Turbo-Rails:如何将 Turbo Frame 添加到 `application.html.erb` ?

标签 ruby-on-rails turbo turbo-rails

我在命令行中运行了以下命令:

> rails new test-turbo
> rails g controller Home index

将以下路线添加到 config/routes.rb :

resources :home, only: [:index]

包裹了<%= yield %>app/views/layouts/application.html.erb在涡轮框架标签中:

  <body>
    <%= turbo_frame_tag :foobar do %>
      <%= yield %>
    <% end %>
  </body>

app/views/home/index.html.erb中添加了一个链接:

<%= link_to "Link to this page", home_index_path %>

然后,当单击该链接时,我收到涡轮帧错误: content missing

如果我将 Turbo 框架标签移动到主页/索引页面,它就可以正常工作:

app/views/home/index.html.erb

<%= turbo_frame_tag :foobar do %>
  <h1>Home#index</h1>
  <p>Find me in app/views/home/index.html.erb</p>
  <%= link_to "Link to this page", home_index_path %>
<% end %>

no error

为什么这有效,但是把它放在 app/views/layouts/application.html.erb 中不起作用?它在一天结束时生成相同的 HTML,对吧?

如果有帮助,here's the GitHub repo 。 promise 537c40a有错误,提交b42ca66工作正常。

更新:这里有一个 gif 显示 a solution that works with two turbo frames, one that is persistent across pages : top bar

最佳答案

在框架中导航时,您的 application布局未呈现。您可以从日志中看到:

Rendered home/index.html.erb within layouts/turbo_rails/frame (Duration: 0.1ms | Allocations: 38)

您正在看着检查员和 <turbo-frame id="foobar"> ,当您单击链接时,当前页面 html 不会被响应 html 替换,这确实是框架的全部要点。仅更新框架内的内容。您可以从网络选项卡中看到实际响应:

响应中没有 Turbo 帧 ^

要渲染布局,您可以在 Controller 中将其显式设置为 override涡轮框架的layout :

layout "application"

仅供引用,布局中几乎不需要涡轮框架,尤其是包裹一切的框架。 <body>元素已经像一个框架一样工作,直接在它下面的另一个框架并不会真正为您带来任何好处。


更新

也许拥有一个完整的 Controller 有点太多了。我会从简单的事情开始。最简单的方法是始终渲染 application布局。跳过布局渲染只是一种加快速度的优化,框架之外的任何内容无论如何都会被丢弃。

您可以添加一些if..else到布局:

...
<body>
  <% unless request.headers["Turbo-Frame"] == "main_content" %>
    <%= turbo_frame_tag :side_bar do %>
      # TODO: sidebar
    <% end %>
  <% end %>

  <%= turbo_frame_tag :main_content do %>
    <%= yield %>
  <% end %>
</body>

关于ruby-on-rails - Turbo-Rails:如何将 Turbo Frame 添加到 `application.html.erb` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75912633/

相关文章:

ruby-on-rails - Rails 7 + Devise + Turbo 流在登录时不显示错误

ruby-on-rails - 具有 2 个不同条件的范围

ruby-on-rails - rails 涡轮流

javascript - 事件未在第一页加载时加载但在刷新后有效

javascript - 处理数据禁用的热线方式是什么?

c - 如果数字长于 5 位,则确定数字是奇数还是偶数的程序显示错误输出

ruby-on-rails - Ruby/Rails - 无法直接在 Controller 中访问 JSON 对象属性

javascript - 如何以编程方式处理英文缩写 [Regex, JS, Ruby]

ruby-on-rails - 如何在返回最新结果时使 Heroku 缓存名称范围