在Rails中扩展现有布局

时间:2010-10-06 17:42:46

标签: ruby-on-rails layout

我有我的主应用程序布局,但后来我的网站的/ account部分与应用程序布局标记完全相同,除了/ account页面在布局的内容区域中添加了侧边栏。

我不想公然复制应用程序布局并创建几乎冗余的“帐户”布局,而是扩展应用程序布局,在内容区域添加侧边栏。

所以我的应用程序布局中有这样的东西:

<html>
<body>

<div id="content">

<%= yield %>

</div>

</body>
</html>

我想要

<html>
<body>

<div id="content">

  <div id="sidebar"></div>

  <%= yield %>

</div>

</body>
</html>

有没有办法在不复制代码的情况下完成此任务?

3 个答案:

答案 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' %>

Further reading

如果您希望将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"

(我不得不承认它不会引起人们的注意)