我有我的主应用程序布局,但后来我的网站的/ account部分与应用程序布局标记完全相同,除了/ account页面在布局的内容区域中添加了侧边栏。
我不想公然复制应用程序布局并创建几乎冗余的“帐户”布局,而是扩展应用程序布局,在内容区域添加侧边栏。
所以我的应用程序布局中有这样的东西:
<html>
<body>
<div id="content">
<%= yield %>
</div>
</body>
</html>
我想要
<html>
<body>
<div id="content">
<div id="sidebar"></div>
<%= yield %>
</div>
</body>
</html>
有没有办法在不复制代码的情况下完成此任务?
答案 0 :(得分:5)
您可以在布局中添加多个yield
,只需为其他名称添加名称:
<html>
<body>
<div id="content">
<%= yield :sidebar %>
<%= yield %>
</div>
</body>
</html>
您可以使用yield
方法
content_for
添加HTML
<% content_for :sidebar do -%>
<div id="sidebar"></div>
<% end -%>
但是你必须将它添加到你想拥有侧边栏的每个视图中。而是创建views/layouts/application_with_sidebar.html.erb
<% content_for :sidebar do -%>
<div id="sidebar"></div>
<% end -%>
<%= render :file => 'layouts/application' %>
如果您希望将yield
的数量保持在最低限度,则可以替代嵌套布局。
<强>视图/布局/ application.html.erb 强>
<html>
<body>
<div id="content">
<%= yield(:with_sidebar) or yield %>
</div>
</body>
</html>
<强>视图/布局/ application_with_sidebar.html.erb 强>
<% content_for :with_sidebar do -%>
<div id="sidebar"></div>
<% end -%>
<%= render :file => 'layouts/application' %>
<强>控制器/ accounts_controller.rb 强>
class AccountsController < ApplicationController
layout 'application_with_sidebar'
...
end
答案 1 :(得分:4)
对于网站的其他部分,您通常会遇到相同的情况,在这种情况下,使用嵌套布局可能会有意义。
http://guides.rubyonrails.org/v2.3.8/layouts_and_rendering.html#using-nested-layouts
答案 2 :(得分:3)
如果您的/帐户路由绑定到帐户控制器,您可以始终拥有带有条件的部分的全功能布局
render :template => "/shared/sidebar" if controller.controller_name == "account"
(我不得不承认它不会引起人们的注意)