2

アプリケーションのレイアウトにレイアウトを追加しようとしています。さまざまなレイアウトソリューションをすべて理解しようとして問題が発生しました。最初に、パーシャルが何であるか、またはそれらがレイアウトであるかどうかを完全に把握していなかったため、レイアウト内のレイアウトだけを試しました。多分私はその質問から始めることができます。レイアウトとパーシャルの違いは何ですか。

これが私が今持っているものです。ナビゲーションと他のいくつかの要素を持つヘッダーコードを別のレイアウトに分離しようとしています。このレイアウトをすべてのビューに配置したいと思います。つまり、コントローラーが呼び出されたときに呼び出される他のビューとともに、アプリケーションレイアウト内のレイアウトである必要があります。これは私のコードで<%= yield%>でカバーされています。そのyeildは機能しますが、:headerは機能しません。

アプリケーションレイアウト app/views / layouts / application.html.erb

<!DOCTYPE html>
<html>
<head>
  <title>home</title>
  <%= stylesheet_link_tag    "application", :media => "all" %>
  <%= javascript_include_tag "application" %>
  <%= csrf_meta_tags %>
</head>
<body>
    <div id="header"><%= yield(:header) %></div> 
    <%= yield %>
</body>
</html> 

ヘッダーレイアウト app/views / layouts / application.html.erb

<% content_for :header %>
    <p>HEADER TEXT</p>
<% end %>

上記のコードが機能しないのはなぜですか?

私が試したこのようなコードも見ましたが、エラーが発生しました。

<%= render layouts/header %>

誰かがこれらすべての異なる方法を説明できますか?ありがとう。

4

3 に答える 3

1

<% content_for :header do %>
    <p>HEADER TEXT</p>
<% end %>

あなたは忘れましたdo

于 2012-12-03T22:30:48.617 に答える
1

ヘッダーとフッターをパーシャルに分割し、views/layoutsフォルダーにそれぞれ「_header.html.erb」と「_footer.html.erb」として配置することをお勧めします。

次に、オプションで各パーシャルを特定のdivでラップできます。これは、ヘッダーで実行しようとしていることです(本文でも同じことを実行できます)。これにより、次のようになります。

<!DOCTYPE html>
<html>
<head>
  <title>home</title>
  <%= stylesheet_link_tag    "application", :media => "all" %>
  <%= javascript_include_tag "application" %>
  <%= csrf_meta_tags %>
</head>
<body>

    <div id="header">
      <%= render 'layouts/header' %>
    </div> 
    <%= yield %>

    <div id="footer">
     <%= render 'layouts/footer' %>
    </div>
</body>
</html> 

それはあなたがしたいことをするでしょう。

'layouts/header'と'layouts/footer'の周りに''があることに注意してください。

レイアウトと部分的な違いについての質問に答えるために、レイアウトは、一貫性のあるヘッダーやフッターなど、アプリケーション全体で使用されるものです。パーシャルはレイアウトにすることができますが、そうである必要はないため、サイト全体の他のビューにパーシャルを固有にすることができます。

于 2012-12-03T22:50:57.970 に答える
0

つまり、最初に、yield構文が正しい場合と正しくない場合がありますが、私はそれを見たことがなく、好きではありません。私はファイル内でyieldを1回だけ呼び出します。

アプリケーションテンプレートファイルにヘッダーをレンダリングしたい場合、それは確かに可能です-私のアドバイスは、それをテンプレートファイルに直接配置することです-結局のところ、それがテンプレートファイルの目的です。何らかの理由でヘッダーを別のファイルに完全にカプセル化したい場合、必要なのはパーシャルです。あなたはこのようなことをするつもりです:

<body>
    <%= render :partial => "shared/header" %>
    <%= yield %>
</body>

これにより、/ shared/_header.html.erbに保存されているヘッダーコンテンツがここのレイアウトにレンダリングされます。

詳細については、こちらのガイドをご覧ください

于 2012-12-03T22:56:54.237 に答える