コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

Railsのcontent_forは別のpartialに記述したものでも動くが、順番や場所によって挙動が変わる

読み込み順番によって変わるやつ。ということで なるべく使わないほうがいい けど動作だけ

環境

rails (5.0.2)

動作概要

通常のviewテンプレートの yield の 記述の前に content_for を 含むpartialを render すれば出てくる。

逆にyield の 記述のあとに content_for を書いても出てこない。

ただし、layoutは位置関係無く反応する。

app/views/layouts/application.html.erb に以下のようにする

<!DOCTYPE html>
<html>
  <head>
    <title>SampleApp</title>
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    <%= stylesheet_link_tag  'application', media: 'all' %>
  </head>

  <body>
    <%= yield(:head_item) %>
    <%= yield %>
  </body>
</html>

app/views/hoges/_partial1.html.erb として以下を用意する

<p>partialその1</p>

<% content_for :title do %>
  <p>これはcontents_forで記述されたものです</p>
<% end %>

<% content_for :head_item do %>
  <p>これはheaditemのcontent_forで記述されたものです</p>
<% end %>

<p>partialその1おわり</p>

yieldの前にrenderすると表示されるケース

下記のように render のあとに該当のyield要素がcontent_forで記述されていれば表示される

<p>該当ページ </p>
<%= render "hoges/partial1" %>
<p><%= yield(:title) %></p>

上記の場合、下記のようにhtml出力される(body要素以外は割愛)

<body>
<p>これはheaditemのcontent_forで記述されたものです</p>

    
<p>該当ページ </p>

<p>partialその1</p>


<p>partialその1おわり</p>
<p>  <p>これはcontents_forで記述されたものです</p>
</p>

</body>

yieldのあとにrenderすると表示されるケース

下記のように render の前にに該当のyield要素がcontent_forで記述されていれば表示されない

<p>該当ページ </p>
<p><%= yield(:title) %></p>
<%= render "articles/partial1" %>

上記の場合、下記のようにhtml出力される(body要素以外は割愛)

<body>
<p>これはheaditemのcontent_forで記述されたものです</p>

<p>該当ページ </p>
<p></p>
<p>partialその1</p>



<p>partialその1おわり</p>

</body>

参考リンク