我在命令行中运行了以下命令:
> 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 %>
如果我将 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 %>
为什么这有效,但是把它放在 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 :
最佳答案
在框架中导航时,您的 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/