8

Rails 3.2 アプリで content_for をテストし、Rails ガイドに従っていますが、それらは実際のファイルに固有のものであり、yield が機能していないようです:

application.html.erb ファイル:

 <!DOCTYPE html>
 <html>
<head>
 ...
</head>

<body>




<%= yield :navigation %> #shouldn't this load the content_for block named :navigation specified in the _main_nav.html.erb partial? 

 <%= yield %>  #this load the index page content


</body>
 </html>

レイアウト ファイル _main_nav.html.erb を作成しました ( <%= render 'layouts/header' %> でレンダリングできることはわかっていますが、代わりに content_for を使用しようとしています) _main_nav.html.erb は次のとおりです。

<% content_for :navigation do %>
<ul>
 <li>Home</li>
 </ul>

<% end %>

RailsGuide http://guides.rubyonrails.org/layouts_and_rendering.html#using-the-content-for-methodを読むと、 これはうまくいくはずです。しかし、そうではありません。エラーは発生しません。単純なようですが、私は困惑しています。

index.html.erb ファイルに移動すると、次の結果が表示されると予想されます。

4

2 に答える 2

12

あなたが望むのは、content_forブロックを含むビューを持つことだと思います。したがって、次のような例があります。

index.html.erb

<% content_for :head do %> 
  <%= stylesheet_link_tag 'users' %> 
  #Above this will load the users stylesheet
<% end %> 

<h2>Example</h2> 
  <ul>
    <% @users.each do |users| %> 
      <li><%= user.name %></li>
    <% end %> 
  </ul>

次に、usersスタイルシート内で生成できるものを出力し、 の名前のシンボルを渡しcontent_forます。

Application.html.erb

    <!-DOCTYPE html> 
      <html> 
        <head> 
         <%= yield :head%>
           <title>This is my title</title 
         </head> 
        <body>
        <p>This is a test</p> 
        <%= yield %> 
     </html> 

ここで何が起こっているかを確認すると、私の例では、application.html.erbusersにロードしたいスタイルシートがあると言って<head></head>います。これを行うcontent_forには、Rails ヘルパーである を設定し、識別子 sysmbol を指定します。この識別子は、 where I do でhead呼び出されます。したがって、アプリケーションに実行させているのは、そのページの my がレンダリングされているときにスタイルシートをロードすることです。これで問題が解決することを願っています。application.html.erbyeild :headindex.html.erbapplication.html.erbusers

アップデートの説明

これに加えて、content_forwithを組み合わせて使用​​する目的は、任意yieldのビューからアプリケーション レイアウトにデータを挿入できるようにすることです。別の例として。次のようにすることができます。

<% content_for :title do %> My Title<% end %> 

ここで、コントローラーがビュー テンプレートをレンダリングし、それをアプリケーション レイアウトと組み合わせると、テキストMy titleが置き換えられます。を使用yield(:head)すると、必要に応じて特定のページに要素を簡単に追加できます。次の例を見てください。

アプリ/ビュー/レイアウト/application.html.erb

<% if content_for?(:navbar) %>
  <%= yield(:navbar) %>
<% else %>
  <%# default navbar %>
  <section class="navbar"></section>
<% end %>

アプリ/ビュー/何とか/index.html.erb

<% content_for(:navbar) do %>
  <section class="navbar"></section>
<% end %>

さらに、アプリケーションの開発方法や使用している設計フレームワークがわからないことに注意してください。 Rails-Bootstrap-Navbar を確認することもできます。代替になる場合もあります。

于 2013-07-20T10:36:17.953 に答える
9

OK、これには解決策があると思います。あなたのコード:

<% content_for :navigation do %>
<ul>
<li>Home</li>
</ul>
<% end %>

読み込み中のファイルの先頭にある必要があります。あなたの _header.html.erb は部分的です。このコードを views/tasks/new.html.erb に移動すると、期待どおりに動作します。

ただし、希望どおりに動作させるには、application.html.erb ファイルを調整する必要があります。

<p>this is where we should see the "Home" link appear that is defined in _header.html.erb:</p>
<section class="header">
<% render 'layouts/header' %>
<%= yield :navigation %>
</section>

= 記号なしで render erb タグを呼び出したことに注意してください。これは、部分的なヘッダーの内容が表示されないことを意味しますが、読み込まれます。= 記号を含めても機能しますが、パーシャルに含まれている可能性のある他のコンテンツもレンダリングします。注: render タグは、yield タグの上または前にある必要があります。

于 2015-03-17T12:09:28.873 に答える