2010-10-06 65 views
6

我有我的主应用程序布局,但是我的网站有一个/帐户部分,它与应用程序布局标记具有完全相同的布局,除了/帐户页面中添加了侧边栏内容区域的布局。在Rails中扩展现有布局

与其明显地复制应用程序布局并创建一个接近冗余的“帐户”布局,我想扩展应用程序布局,在内容区域添加侧边栏。

所以我有这样的事情在我的应用程序布局:

<html> 
<body> 

<div id="content"> 

<%= yield %> 

</div> 

</body> 
</html> 

,我想

<html> 
<body> 

<div id="content"> 

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

    <%= yield %> 

</div> 

</body> 
</html> 

有没有办法做到这一点不复制的代码?

回答

3

如果你的/帐户路由绑定账户控制器,你可以随时与条件部分包含完整的布局像这样

render :template => "/shared/sidebar" if controller.controller_name == "account" 

(我不得不承认,它不讨好眼睛虽然)

4

对于网站的其他部分,您经常会遇到同样的情况,在这种情况下,使用嵌套布局可能会有意义。

http://guides.rubyonrails.org/v2.3.8/layouts_and_rendering.html#using-nested-layouts

+0

请务必查看相同文档的[更新版本](http://guides.rubyonrails.org/v4.0.12/layouts_and_rendering.html#using-nested-layouts)。 Rails的新版本发生了变化,链接的示例可能不再有效。 – 2015-07-21 13:45:21

5

您可以在布局多个yield,索性放弃了额外的人一个名字:

<html> 
<body> 
    <div id="content"> 
    <%= yield :sidebar %> 
    <%= yield %> 
    </div> 
</body> 
</html> 

您可以通过使用content_for方法

yield添加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 S上的数目保持在最低限度,你可以嵌套的布局来代替。

视图/布局/ 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 
+0

然后我将变量放入主要的全局布局中,该布局不适用于网站的所有部分。只是感觉不对。感谢这个想法。 – 2010-10-06 18:29:57

+0

@Chad像@mark建议的嵌套布局可能是最好的选择。这一切都取决于你需要多久这个标记出现。 – 2010-10-06 19:26:03