ボクココ

個人開発に関するテックブログ

Rails の content_for のつかいどき

ども、@kimihom です。

今回は Rails の ActionView における、content_for について。まずは簡単な使い方からおさらいしよう。

content_for の使い方

例えば、 app/views/layouts/application.html.erb がこんな作りになっていたとする。

<!DOCTYPE html>
<html>
<head>
  <title><%= page_title %></title>
  <%= stylesheet_link_tag    'application', media: 'all' %>
  <%= csrf_meta_tags %>
</head>
<body>

<%= yield %>

<%= javascript_include_tag 'application' %>

<%= yield :footer %>

</body>

JavaScriptの読み込みはRailsだと巨大になりがちなので、こうやってbodyの下の方に置くのが良いとされている。さて、ここで注目いただきたいのは、 <%= yield :footer %> の記述だ。content_for を使う上でシンボルの名前付き yield をレイアウト側に定義しておく。

すると、例えば「個別のViewでページロード時にJavaScriptを実行したい。」としよう。すると以下のようなコードになる。app/views/welcome/index.html.erb とでもしておこう。

<div id="welcomePage">
  <h1>ようこそ。</h1>
  <p>こんにちは、<span id="name"></span></p>
</div>

<script>
$(function() {
   $("#name").text("テストさん");
});
</script>

このコードは正しく動かない。なぜならば、 yield の後に application.js を読み込んでいるため、 $がまだ定義されていない状態のためだ。こういうとき、content_for を使って、正しい位置にscriptタグを挿入してあげることで、問題を解決できる。

<div id="welcomePage">
  <h1>ようこそ。</h1>
  <p>こんにちは、<span id="name"></span></p>
</div>

<% content_for :footer do %>
<script>
$(function() {
   $("#name").text("テストさん");
});
</script>
<% end %>

このように、元のレイアウト内の特定の場所にコードを配置していきたいときに、content_for は便利なヘルパーメソッドである。

この使い方の他に、レイアウトファイルの<head>要素内に yield を用意し、そこで content_for を使えばヘッダに記述する内容も、個別のviewファイルで管理することが可能となる。

そう考えると、content_forなかなか便利なメソッドではないだろうか。