🦓

[Rails]タイトルを動的に出力する14/20

に公開

はじめに

content_forを使って各テンプレートファイルからレイアウトファイapplication.html.erbにタイトル情報を渡せます。

現状タイトルはこのようになっています。

以下のようにタイトルが表示されるように実装します。
トップページ・・・・・・Article APP
ログインページ・・・・・ログイン | Article APP
ユーザー登録ページ・・・ユーザー登録 | Article APP
投稿作成ページ・・・・投稿作成 | Article APP
投稿一覧ページ・・・・投稿一覧 | Article APP
投稿詳細ページ・・・・個別の投稿のタイトル名 | Article APP

環境:

Rails 6.1.7.3
ruby 3.0.0

content_forとは

content_forメソッドは、ビューテンプレート内でコンテンツを定義して、レイアウトテンプレートの特定の場所にそのコンテンツを挿入するために使用されます。

通常、レイアウトテンプレートはアプリケーションの全体的なデザインや構造を定義し、ビューテンプレートはそれに基づいて具体的なコンテンツを提供します。しかし、レイアウトテンプレートの特定の部分(例:サイドバー、ヘッダー、フッターなど)をビューテンプレートから動的にカスタマイズしたい場合があります。

ここでcontent_forが登場します。ビューテンプレート内でcontent_forメソッドを使用して特定のキーとコンテンツを定義すると、そのコンテンツはレイアウトテンプレートの対応する部分で表示されます。つまり、ビューテンプレートからレイアウトテンプレートにコンテンツを挿入することができます。

以下はcontent_forの使用例です:

レイアウトテンプレート(例:application.html.erb)内で、yieldメソッドを使用してコンテンツを表示する場所を定義します。

<%= yield :sidebar %>

ビューテンプレート内で、content_forメソッドを使用して特定のキーとコンテンツを定義します。

<% content_for :sidebar do %>
  <div class="sidebar">
    <!-- サイドバーコンテンツ -->
  </div>
<% end %>

このようにすると、ビューテンプレート内で定義されたサイドバーコンテンツが、レイアウトテンプレートのyield :sidebar部分に挿入されます。

content_forを使用することで、ビューテンプレートとレイアウトテンプレートの間で柔軟なコンテンツの共有とカスタマイズが可能になります。
https://api.rubyonrails.org/v7.0.6/classes/ActionView/Helpers/CaptureHelper.html#method-i-content_for

helperとは

ヘルパー(Helper)は、Railsで使用される再利用可能なメソッドの集合です。ヘルパーメソッドは、ビューファイルやコントローラー、モデルなどのRubyコード内で呼び出すことができます。主な目的は、ビューファイルのコードを簡潔に保ち、再利用可能なコードを書くことです。

一般的なヘルパーの例としては、以下のようなものがあります:

  1. テキストヘルパー:テキストのフォーマットや変換、エスケープなどのタスクを実行します。例えば、link_toメソッドは、リンクを生成するためのヘルパーメソッドです。

  2. 日付ヘルパー:日付や時刻のフォーマットや表示方法を提供します。例えば、time_ago_in_wordsメソッドは、指定した日時から現在までの経過時間を表示するためのヘルパーメソッドです。

ヘルパーメソッドは、ビューファイル内で呼び出すことができますが、コントローラーやモデルからも呼び出すことができます。ただし、ヘルパーメソッドは主にビューロジックに関連するタスクを処理するために使用されるため、コントローラーやモデル内での使用は制限されるべきです。

ヘルパーファイルは、app/helpersディレクトリ内に配置されます。デフォルトでは、RailsはApplicationHelperという名前のヘルパーファイルを提供します。

例えば、表示する日付をフォーマットするヘルパーメソッドを作成する場合、以下のようにします:

app/helpers/application_helper.rb
module ApplicationHelper
  def formatted_date(date)
    date.strftime("%Y-%m-%d")
  end
end

上記の例では、formatted_dateというヘルパーメソッドを定義しています。これは、引数として渡された日付を指定されたフォーマットで返します。

ビューテンプレート内でこのヘルパーメソッドを使用するには、以下のようにします:

app/views/posts/show.html.erb
<p>投稿日: <%= formatted_date(@post.created_at) %></p>

このようにすると、formatted_dateメソッドが呼び出され、@post.created_atの値が指定されたフォーマットで表示されます。

ヘルパーメソッドは、ビューテンプレート内で一般的な操作や計算を行うために使用されます。例えば、HTMLの生成、URLの生成、テキストのフォーマットなどが含まれます。ヘルパーは、ビューファイル内でロジックを繰り返し記述する代わりに、より効率的で保守性の高いコードを実現するための手段として活用されます。

helperを作成する

三項演算子を使ってタイトルの出力を定義します。

app/helpers/application_helper.rb
module ApplicationHelper
    def page_title(title)
        base_title = 'Article APP' 

        title.empty? ? base_title : title + " | " +  base_title
    end
end

yieldを使ってタイトルを表示させる

app/views/layouts/application.html.erb
<title><%= page_title(yield(:title)) %></title>

投稿一覧ページ

app/views/articles/index.html.erb
<% content_for(:title, t('.title')) %>

投稿詳細ページ

app/views/articles/show.html.erb
<% content_for(:title, @article.title) %>

投稿作成ページ

app/views/articles/show.html.erb
<% content_for(:title, t('.title')) %>

ブックマーク一覧ページ

app/views/articles/bookmarks.html.erb
<% content_for(:title, t('.title')) %>

ログインページ

app/views/sessions/new.html.erb
<% content_for(:title, t('.title')) %>

登録ページ

app/views/signup/new.html.erb
<% content_for(:title, t('.title')) %>

翻訳を登録する

config/locales/views/ja.yml
ja:
  defaults:
  sessions:
    new:
      title: 'ログイン'
    edit:
      title: 'パスワード更新'
    new:
      title: 'パスワードリセットリクエスト'
  articles:
    index:
      title: '投稿一覧'
    bookmarks:
      title: 'ブックマーク一覧'
    new:
      title: '投稿作成'
    edit:
      title: '投稿編集'
    show:
      title: '投稿詳細'
  signup:
    new:
      title: '新規登録'

Image from Gyazo

おわりに

ヘルパーメソッド便利ですね。
また、content_foryieldを使うことでテンプレートファイルの情報をレイアウトファイルに渡すことができました。

https://osamudaira.com/194/
https://qiita.com/tomokichi_ruby/items/fdf4369ad4aaf45c7303

Discussion