Webアプリケーションでは、タイトルやキーワードといったmetaタグを設定することになると思います。 それ以外にも、最近だとFacebookのOGPのように、設定すべきmetaタグも増えており、メンテナブルな実装が求められます。 ここでは、その要件やmeta-tagsによる実装について説明します。

要件

ここでは、以下を行なえることを要件とします。

  • 以下の項目を設定できること:
    • title/keywords/description
    • FacebookのOGP
    • Twitterカード
  • 基本的な項目をI18nで設定できること
  • ページごとに上書きできること

手順

以下の手順でタイトルやmetaタグを設定していきます。

1. インストールする

まずGemfileに以下を追記し、bundle installします。

gem 'meta-tags'

2. コントローラで基本情報を設定する

次に、すべてのページに対する基本的な情報をApplicationControllerに設定します。 記述量が多いため、Concernとして分離した方がよいでしょう。

たとえば、以下のようにします。

app/controllers/concern/meta_taggable.rb:

module MetaTaggable
  extend ActiveSupport::Concern

  include ActionView::Helpers::AssetUrlHelper

  included do
    before_action :prepare_meta_tags
  end

  private

  def prepare_meta_tags(options = {})
    base = t('meta_tags.base')

    site = base[:site]
    description = base[:description]
    title = t("meta_tags.titles.#{controller_name}.#{action_name}", default: '')
    image = image_url('image.png')

    defaults = {
      site: site,
      title: title,
      description: description,
      keywords: base[:keywords],
      og: {
        url: request.url,
        title: title,
        description: description,
        site_name: site,
        type: 'article',
        image: image
      },
      twitter: {
        card: 'summary',
        site: '@simpliejp',
        title: title.presence || site,
        description: description,
        image: image
      }
    }

    options.reverse_merge!(defaults)

    set_meta_tags(options)
  end
end

app/controllers/application_controller.rb:

class ApplicationController < ActionController::Base
  include MetaTaggable
end

3. ビューでタグを出力する

タグを出力するための記述をビューに行ないます。 display_meta_tagsを1行書くだけで、必要なタグをすべて出力してくれます。

app/views/layouts/application.html.erb:

<!DOCTYPE html>
<html>
  <head>
    <%= display_meta_tags reverse: true %>
      :

4. 情報を設定する

サイト名や説明文といった基本的な情報は、以下のように設定します。 こうすることで、多言語化も簡単に対応することができます。

config/locales/meta_tags.ja.yml:

ja:
  meta_tags:
    base:
      site: SimpliePost
      description: 小さなチームでサービスをつくるリモートワークのエンジニアのためのメディア
      keywords:
        - サービス
        - リモートワーク
        - エンジニア
    titles:
      posts:
        index: 記事一覧

5. ページごとに上書きする

最後に、ページごとにmetaタグの内容を上書きする方法についてです。

たとえば記事個別ページにおいて、記事のタイトルをページのタイトルとして設定するとします。 この場合、次のようになります。

class PostsController < ApplicationController
  def show
    @post = Post.find(params[:id])

    prepare_meta_tags(title: @post.title)
  end
end

おわりに

一度実装しておけば、ページが増えても簡単にタイトルやmetaタグを設定することができます。 長く運用するサービスの場合は、ぜひ対応しておきましょう。