【发布时间】:2011-11-22 16:08:06
【问题描述】:
如果我有一个<%= yield %> 标签,那么我的所有视图都会呈现在布局中的同一个位置。我可以为不同的视图设置不同的<%= yield %> 标签吗?那么我该怎么做呢?谢谢
【问题讨论】:
-
包含内容的视图在哪个文件夹中是否重要?视图来自哪个控制器呢?
标签: ruby-on-rails ruby layout view yield
如果我有一个<%= yield %> 标签,那么我的所有视图都会呈现在布局中的同一个位置。我可以为不同的视图设置不同的<%= yield %> 标签吗?那么我该怎么做呢?谢谢
【问题讨论】:
标签: ruby-on-rails ruby layout view yield
查看ActionView::Helpers::CaptureHelper。你可以在你的视图中做这样的事情:
<% content_for :sidebar do %>
<!-- sidebar content specific to this page -->
<% end %>
这将在 content_for 块内运行模板,但不会作为常规模板 yield 缓冲区的一部分输出,它将存储在单独的缓冲区中以备后用。然后稍后,包括在布局中,您可以使用yield :content_name 来输出内容:
<div class="content">
<%= yield %>
</div>
<div class="sidebar">
<%= yield :sidebar %>
</div>
因此,从某种意义上说,您可以为不同的视图使用不同的 yields,您只需在视图中为不同的内容命名为 content_for,并在布局中使用相同的名称生成它。
考虑您的情况,您希望在不同的地方获得不同的视图。假设您有三个面板,面板 1、面板 2 和面板 3。您可以在布局中执行此操作:
<div id="panel1"><%= yield :panel1 %></div>
<div id="panel2"><%= yield :panel2 %></div>
<div id="panel3"><%= yield :panel3 %></div>
如果你不想,你甚至不需要包含一个普通的<%= yield %>。然后在您的视图中,您可以通过使用适当的content_for 包围整个视图来选择在哪个面板中显示内容。例如,您的一个视图可能会这样更改:
<% content_for :panel2 do %>
<!-- Your View -->
<% end %>
在面板 2 中显示。另一个可能用于面板 3,如下所示:
<% content_for :panel3 do %>
<!-- Your View -->
<% end %>
【讨论】:
您可以将产量和内容用于:
For example:
<%= yield :head %>
<% content_for :head do %>
<title>A simple page</title>
<% end %>
【讨论】:
是的,您可以有多个<%= yield %> 标签。您可以在基本视图中为每个 yield 标签指定类似这样的名称。
<%= yield :head %>
<%= yield :footer %>
然后在您的个人视图中使用content_for 标签。
<% content_for :head do %>
<%= stylesheet_link_tag 'custom' %>
<% end %>
【讨论】: