タイトルを動的に表示する方法
ページ毎にタイトルを変える方法
下記のようなタイトルをページ毎に変える方法になります。
各テンプレート(ビュー)間で異なる情報をレイアウトファイルに伝えたい場合は、[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の処理]が三項演算子の書き方。
参考記事: