私は次のアプローチを使用して、レイアウトの「ネスト」を実現します。これは、私が最も有用であることがわかったレイアウト継承の形式です。
メイン アプリケーション ヘルパー モジュール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.erbcontainer.html.erbapp/views/layouts/container.html.erb
<!DOCTYPE html>
<html>
<head>
<title>Sample</title>
</head>
<body>
<%= yield %>
</body>
</html>
yieldincontainer.html.erbは、「派生」(または子) layout を生成します。application.html.erbつまり、レンダリングの出力を of に挿入しapplication.html.erbます。呼び出されるポイントまでレイアウトの出力をキャプチャするため、呼び出しはテンプレートの最後に来る必要があることに注意してください。<body>container.html.erbparent_layout
これはこの記事に基づいていますが、Rails 3.2 (そしてできればそれ以降) で動作するように更新されています。Rails 4 で試したことはありませんが、同様の機能を得ることができます。