5

Rubyにレイアウト継承の実装があるかどうか疑問に思っていました。symfony では、これを行うことができます:

layoutmain.html
Give <head> and all that here
<body>
<h3>{{title}}</h3>

{{block view}}
<div class="row">
<div class="span3">
{{content}}
</div>
</div>

{{end block}}


</body>


layout2.html
{{inherits layoutman}}
{{block view}}
 <div class="container">
Structure it differently
 </div>
{{end block}}

いわば、テンプレート全体を継承し、別のレイアウトの部分をオーバーライドできます。したがって、スクリプトなどはメイン テンプレートにそのまま残りますが、ビュー構造を変更できます。したがって、最初のレイアウトでコードの一部を再利用できます

github で液体継承プロジェクトを見つけましたが、時代遅れに見えました

4

2 に答える 2

3

私は次のアプローチを使用して、レイアウトの「ネスト」を実現します。これは、私が最も有用であることがわかったレイアウト継承の形式です。

メイン アプリケーション ヘルパー モジュール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 で試したことはありませんが、同様の機能を得ることができます。

于 2013-08-13T16:09:07.520 に答える