概要
原著者の許諾を得て翻訳・公開いたします。
- 英語記事: Set your page title in the view template using content_for - Andy Croll
- 原文公開日: 2017/12/11
- 著者: Andy Croll
Rails: ページタイトルはビューテンプレートのcontent_for
で表示すること(翻訳)
Railsでは、コンテンツを1箇所に保存して他のビューやレイアウトやヘルパーで使えるようにする場合、主にcontent_for
を使います。content_for
について詳しくは、Rails APIドキュメントのActionView helpersセクションをご覧ください。
次のように書かないこと
コントローラでインスタンス変数を使うやり方。
things_controller.rb
def show
@page_title = 'Page Title'
# 他にも何かコントローラっぽいことをする
end
views/layouts/application.html.erb
<head>
に以下のように書く。
<title><%= @page_title || 'Default' %></title>
次のように書くこと
content_for
とyield
を使うやり方。
things/show.html.erb
私は、個別のビューファイルの冒頭にタイトルを置くのが好みです。
<% content_for(:html_title) { 'Title' } %>
* views/layouts/application.html.erb
<head>
に以下のように書く。
<title><%= content_for?(:html_title) ? yield(:html_title) : "Default" %></title>
そう書くべき理由
content_for
を使うことで、HTMLをレンダリングする方法に関する情報を関連するビューテンプレート内に保持でき、ビジネスと関係のないロジックでコントローラを汚さずに済みます。
Railsでは(訳注: コントローラで)インスタンス変数を作成すると自動的にビューに渡されますが、そういう「魔法のインスタンス変数」をさらにこしらえるのは避けましょう。
<title>
に使うコンテンツは、JSONやAJAXをレンダリングする際に同じコントローラのアクションから参照したり参照されたりすることはありません。レンダリングされたHTMLだけがこの情報にアクセスします。すなわち、この情報を公開するのにインスタンス変数を使う必要などありません。この情報はhtml.erb
ビューテンプレートだけに属します。
冒頭のように書くべきでない理由
インスタンス変数で情報を渡すと、Railsフレームワークにせっかく備わっているツールを無視していることになります。しかし無視しても動いてしまうのです。