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

概要 原著者の許諾を得て翻訳・公開いたします。 英語記事: 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フレームワークにせっかく備わっているツールを無視していることになります。しかし無視しても動いてしまうのです。 関連記事 Rails: render_async gemでレンダリングを高速化(翻訳) Rails tips: ビューの`content_tag`のあまり知られていないオプション(翻訳)