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