タイトルを動的に表示する方法


ページ毎にタイトルを変える方法
下記のようなタイトルをページ毎に変える方法になります。 Image from Gyazo

各テンプレート(ビュー)間で異なる情報をレイアウトファイルに伝えたい場合は、[content_for]を使います。 [content_for]の使い方や手順は、以下になります。

railsは、[application.html.erb]ファイルに各テンプレートファイルを読み込みwebページを表示する流れになっているので、 [application.html.erb]に定義されたの情報は、各ビューファイルをブラウザで表示するのに毎回利用される。 ブラウザに表示するタイトルを定義するに以下のように記述する。

[app/views/layouts/application.html.erb]

<head>
    <title><%= page_full_title(yield(:title)) %></title>



[app/helpers/application.helper.rb]ファイルに以下のようにメソッドを定義する。([app/views/layouts/application.html.erb]で呼んでいるメソッドの定義)

[app/helpers/application.helper.rb]

def page_full_title(page_title = '')
    base_title = "Rails学習サイト"
    page_title.empty? ? base_title : page_title + ' | ' + base_title
end



各ビューファイルに以下のように記述する。(1番上に記載するのが分かりやすい。) (:title, "ログイン")のログイン部分を翻訳ファイルに登録して<% content_for(:title, (t '.title')) %>と記載した方が良い。

[app/views ファイル]

<% content_for(:title, "ログイン") %>

上記に記載した手順の流れは、以下のようになる。 [app/views/layouts/application.html.erb]の[yield(:title)]で、各ビューファイルに定義した[content_for]の値を読み込む。 今回の場合は、[title]というキーで値を指定しているので、[yield(:title)]でも[title]というキーが付いた[content_for]を読み込んでいる。

[app/views/layouts/application.html.erb]に記載の<%= page_full_title(yield(:title)) %>というのは、 [app/helpers/application.helper.rb]に定義した[page_full_title]メソッドに引数として[yield(:title)]で読み込んだ値を渡しているという事。

上記で呼ばれた[app/helpers/application.helper.rb]の挙動は、以下の通り。 ①[base_title]という変数に[Rails学習サイト]という文字を代入している。 ②引数のpage_title部分。)が空の文字列だった場合は、変数[base_title]を返り値とする。  引数の[page_title]に文字列があった場合は、[page_title + ' | ' + base_title]で、「引数名 | base_titleに定義した変数」が返り値となる。


※ポイント
[app/helpers/application.helper.rb]に記載の[page_full_title]メソッドの引数が(page_title = '')となっているのは、 [page_title]という引数が無かった場合にデフォルトで、空の文字列を入れるという引数にデフォルトの設定をしている。(この設定をしないと引数が引数が無い場合に、エラーとなってしまう。)

[app/helpers/application.helper.rb]記載のメソッドの中の書き方は、三項演算子といって下記を省略した書き方。(コードを減らせる)

[app/helpers/application.helper.rb]

def page_full_title(page_title = '')
  if page_title.empty?
    base_title
  else
    page_title + " | " + base_title
end

[条件式(.empty?) ? trueの処理 : falseの処理]三項演算子の書き方。

参考記事:

【Rails 】content_forとyieldの使い方 - Qiita

【Ruby・Rails】三項演算子(条件演算子)を使ってif文をスリムに書こう! - Qiita