2

7 つのページが静的で、ほとんど同じように見え、同じコントローラーを共有するアプリケーションを構築していますStaticPagesController。ディレクトリStaticPagesController内のビューの名前に対応する 7 つの空のアクションを定義しました。static_pages

すべての静的ページは、一般的なアプリケーション レイアウト (layouts/application.html.erbヘッダーとフッターで構成される ) に基づいており、上部に「ヒーロー ユニット」 (写真付きの大きなバナー) があり、その下に 2 つの列があります。最初の列にはページごとに異なるテキストの段落が含まれ、2 番目の列には ActiveModel オブジェクトのコレクションが表示されます (オブジェクトの異なるサブセットが各ページに表示されますが、レンダリング コードを 1 回だけ記述できるようにするため)。

質問

私が達成したいのは、ヘッダーとフッターを継承し、layouts/application.html.erb各ページ間で変更されるコードのみを記述して、構造、ヒーローのレンダリング、およびコレクションのレンダリングの重複を回避できるレイアウトです。

私の(おそらく間違った)解決策

これを行う方法を見つけましたが、ネストされたレイアウトに関するRailsガイドを読んだ後、少し混乱し、それが正しい方法であるかどうかはよくわかりません. これが私がやった方法です:

layouts/static_page.html.erb次のコードで作成しました。

<%= render partial: 'shared/hero', locals: { big: true, big_text: hero_big_text } %>

<div class="container">
  <div class="row">
    <div class="col-sm-6">
      <%= yield :introduction %>

      <%= render 'hook_button' %>
    </div>
    <div class="col-sm-6 bo-offers-col">
      The @collection will be rendered here
    </div>
  </div>
</div>

最初の行は、ビューで定義する必要があるそのうちの 1 つを含む、いくつかのローカルを渡すヒーローをレンダリングします。残りのコードは 2 つの列を作成introductionし、最初の列でコードを生成し、2 番目の列で @collection オブジェクト (コントローラーで定義される) をレンダリングすることになっています。

ビューの1つに含まれるものは次のとおりです。

<%# Page title %>
<% provide :title, "Page title" %>

<%# Specify the content %>
<% content_for :hero, yield(:title) %>

<% content_for :introduction do %>
  <h2>Page subtitle</h2>
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris congue fermentum quam a lacinia.</p>
  <p>Maecenas at sapien ut risus congue sodales eget quis enim. Etiam pulvinar nulla non libero lobortis vulputate. Aliquam convallis sapien nec velit sagittis molestie. Morbi porta pulvinar varius. Donec nec velit at nisi ultrices commodo viverra eu enim.</p>
<% end %>

<%# Render the stuff %>
<%= render template: 'layouts/static_page', locals: { hero_big_text: false } %>

<title>最初に、ページとヒーロー内のテキストの両方として使用されるタイトルを指定します。content_for最初の列の内容も提供するために使用します。
最後に、<%= render template: 'layouts/static_page', locals: { hero_big_text: false } %>先ほど定義したテンプレートをレンダリングし、表示するヒーローのタイプを決定するために使用するローカルを渡します (ヒーロー パーシャルで使用)。

このソリューションは機能しますが、意味的に正しいかどうか、またはこれを行うためのより良い方法があるかどうかはわかりません。この正確な問題に対処するドキュメントや質問を見つけることができませんでした。それを行うためのより良い方法があるかどうかを知りたい.

4

1 に答える 1

1

ここでは部分的なレイアウトを使用して、さまざまなcontent_for呼び出しを少し簡素化することをお勧めします。ビューファイルからこれを行います

<%= render layout: 'hero_layout', locals: { hero_big_text: false } do %>
  <h2>Page subtitle</h2>
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris congue fermentum quam a lacinia.</p>
  <p>Maecenas at sapien ut risus congue sodales eget quis enim. Etiam pulvinar nulla</p>
<% end %>

そしてlayouts/static_page.html.erb、上記のコードで参照されている部分レイアウトを作成する代わりに、次のようなコードを使用app/views/application/_hero_layout.html.erbします。

<%= render partial: 'hero', locals: { big: true, big_text: hero_big_text } %>

<div class="container">
  <div class="row">
    <div class="col-sm-6">
      <%= yield %>

      <%= render 'hook_button' %>
    </div>
    <div class="col-sm-6 bo-offers-col">
      The @collection will be rendered here
    </div>
  </div>
</div>

sharedまた、パーシャルにフォルダーを使用することは、もはや正しい方法ではないことに注意してください。代わりに、テンプレートの継承を使用できます。したがって、heroパーシャルはテンプレートの継承パスから取得されます。これはおそらく、それを配置する必要があることを意味しますが、それは/app/views/application/_hero.html.erbアプリの仕様次第です。

于 2013-09-05T03:41:17.617 に答える