Rails: ページタイトルはビューテンプレートの`content_for`で表示すること(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

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_foryieldを使うやり方。

  • 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フレームワークにせっかく備わっているツールを無視していることになります。しかし無視しても動いてしまうのです。

関連記事

Rails: render_async gemでレンダリングを高速化(翻訳)

Rails tips: ビューの`content_tag`のあまり知られていないオプション(翻訳)

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の半分ほど、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れてそれぞれ一部を翻訳。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好き。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ