我使用以下方法来实现布局的“嵌套”,这是我发现最有用的布局继承形式。
在主应用程序助手模块中app/helpers/application_helper.rb
,我定义了一个助手方法parent_layout
:
module ApplicationHelper
def parent_layout(layout)
@view_flow.set(:layout, self.output_buffer)
self.output_buffer = render(:file => layout)
end
end
这个助手负责捕获当前布局的输出,然后渲染指定的父布局,并在父布局时插入子布局yield
。
然后在我看来,我可以按如下方式设置布局继承。我从我的主应用程序布局开始,app/views/layouts/application.html.erb
这是此配置中的子布局:
<div class="content">
<h1><%= content_for?(:title) ? yield(:title) : 'Untitled' %></h1>
<div class="inner">
<%= yield %>
</div>
</div>
<%= parent_layout 'layouts/container' %>
对辅助方法的调用parent_layout
指定它application.html.erb
是 的子布局container.html.erb
。然后我定义父布局app/views/layouts/container.html.erb
如下:
<!DOCTYPE html>
<html>
<head>
<title>Sample</title>
</head>
<body>
<%= yield %>
</body>
</html>
yield
incontainer.html.erb
产生于“派生”(或子)布局,即将application.html.erb
渲染的输出插入application.html.erb
到<body>
of 中container.html.erb
。请注意,parent_layout
调用需要出现在模板的末尾,因为它会捕获布局的输出,直到调用它为止。
这是基于这篇文章的,但更新后可以在 Rails 3.2 中工作(希望以后能工作)。我没有在 Rails 4 中尝试过,但你可以得到类似的工作。