タイトルを動的に表示する
課題
共通レイアウトであるapplication.html.erbのhead部分は現在<title>アプリのタイトル</title>
というような静的なタイトルが記載されている。このままだとWebページで検索した際、一覧ページであろうが、新規登録ページであろうが、ページタイトルは全て共通のものとなってしまう。
何がいけないの?
- ユーザビリティ、つまり特定の利用者にとって使い勝手が良くない。
- SEOの側面でよろしくない。
→ SEO(Search Engine Optimazation)…検索エンジン最適化。検索エンジンの中には「こういったページは良いページだから、検索結果を最初の方に表示してあげよう」といった特定の基準がある。これを満たす行為のことを検索エンジンの最適化、SEOという。
対策
- Railsにデフォルトで用意されているcontent_forというメソッドを使う。
- (provideというものもあるそうな)
使い方
① レイアウトファイルのhead部分を以下のように変更する
application.html.erb
<title>アプリのタイトル</title> ↓ <title><%= yield(:title) %></title>
② それぞれのビューファイルに以下の記載を追加
<%= content_for(:title, 'ログイン|アプリのタイトル')%>
これでページを開いたときのタイトル部分が変更されている
- かっこは省略化
- i18nを当てる時はカッコがきで記載
<%= content_for :title, (t'.title')%>
タイトル初期値の設定
下記のように記載すると、content_forの指定がなかったページはデフォルトのタイトルになる。
<title><%= contetn_for?(:title) ? yield(:title) : "デフォルトのタイトル"%></title>
↑三項演算子というやつ。 こうやって使うのか!!!と目から鱗だった🐟
条件式 ? trueの処理 : falseの処理
やってみたこと
以下、私がやってみただけで最適解ではない様です。
- 課題としてはタイトルを
ページ名| アプリ名
の様にすることであり、上記の使い方の様に記載しては全ページ分必要になってしまうので、下記の様にする。
翻訳ファイル
ja: defaults: page_title: "%{item}|アプリ名"
各画面のビューファイル一番上
<%= content_for :title do %> <%= t'defaults.page_title', item: (t'.title') %> <% end %>
- i18nの翻訳ファイルに既に各ページタイトルの翻訳文を記載しているのでitemは翻訳文を利用
- これでタイトル部分が
ログイン|アプリ名
という形になった。
※上記の書き方では、ブロックにしないとシンタックスエラーが出てしまった。
- 全部のビュー画面の上にcontent_forを記載するのは面倒臭かったので共通レイアウトのbody部分に記載してみたが上手く行かなかった。パーシャルを作ってみたが表示されなかった。
後から見つけたサイト
わざわざ翻訳で書かなくてもページタイトル|アプリ名
の表示にする方法があった。
<title><%= contetn_for?(:title) ? yield(:title) + '|アプリ名' : "デフォルトのタイトル"%></title>
( д) ゚ ゚
基本的なやり方だった。これもこうやって使うのか…と思った。
所感
ちゃんと課題文を読んでおらず、helper、moduleというキーワードを完全に失念していました。
helperとは
rails g controller
をした際に生成されている
rails g controller Users
create app/helper/users_helper.rb
create app/controllers/users_controller..rb
その実態はmoduleのことであり、今回の課題はそこに各ページで使うモジュールを設定すること。
参考にしたサイト
【Rails 】content_forとyieldの使い方 - Qiita
ユーザビリティは、単なる「使いやすさ」ではない!(UXデザインセンター #003)
UIとUXの違いとは?デザインを改善するポイントも解説! | Lakeside Software
https://wa3.i-3-i.info/word1382.html
[Rails] content_forでレイアウトの内容をviewから柔軟に変更する | Akashic Records
おまけ
UI・・・ユーザーインターフェース
- 端的に、サービスの扱いやすさ、ユーザーとの接点
- サービスのデザイン性や操作性を指す。快適な操作感や視認性に優れたレイアウトという面でも、ユーザーの使いやすいと感じられるサービスが求められる
UX・・・ユーザーエクスペリエンス
- ユーザーの体験。
- そのプロダクトやサービスにおいてユーザーが感じる体験のこと
- UIもこれに内包される