meta設定
デフォルトのレイアウトをつくる
https://github.com/kpumuk/meta-tags gem をインストールする
doctype html
html
head
= render partial: 'layouts/meta_tags'
= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true
= javascript_include_tag 'application', 'data-turbolinks-track' => true
= csrf_meta_tags
body
= yield
metaタグのpartialをつくる
meta-tagsのgemでカバーしていないmetaタグをざっと書いていく。
最後に display_meta_tags(default_meta_tags)
というメソッドでデフォルトのmetaタグを呼び出す。
meta(content='NOYDIR' name='ROBOTS')
meta(content='NOODP' name='ROBOTS')
link(media='handheld' rel='alternate')
meta(name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0, shrink-to-fit=no")
meta(property="fb:app_id" content=Settings.site.meta.fb.app_id)
/ IEで「互換モード」で表示されるのを防ぐための指定
meta(http-equiv="X-UA-Compatible" content="IE=Edge")
/ webclip icon
meta(name="apple-mobile-web-app-capable" content='yes')
meta(name="apple-mobile-web-app-status-bar-style" content='default')
link(rel="apple-touch-icon" href=Settings.site.meta.webclipicon)
- if noindex?
- set_meta_tags noindex: true, nofollow: true
= display_meta_tags(default_meta_tags)
default_meta_tagsメソッド
@page_title
などの変数の上書きがなければ、
その後に続く値 @page_title || 'xxx'
をデフォルトでセットする。
module ApplicationHelper
def default_meta_tags
{
charset: 'utf-8',
site: Settings.site.name,
reverse: true,
title: @page_title || Settings.site.meta.title,
description: @page_description || Settings.site.meta.description,
keywords: @page_keywords || Settings.site.meta.keywords,
canonical: url_for(only_path: false, protocol: 'https'),
icon: Settings.site.meta.favicon,
og: default_og,
twitter: default_twitter
}
end
def default_og
return if noindex?
{
title: @og_title || Settings.site.meta.og.title, # :title
description: @og_description || Settings.site.meta.og.description, # :description
type: Settings.site.meta.og.type,
url: :canonical,
image: page_og_image,
site_name: Settings.site.name,
locale: 'ja_JP'
}
end
def page_og_image
@page_image || image_url(Settings.site.meta.og.image)
end
def default_twitter
return if noindex?
{
card: "summary_large_image",
title: @twitter_title || Settings.site.meta.twitter.title,
description: @twitter_description || Settings.site.meta.twitter.description,
image: page_twitter_image
}
end
def page_twitter_image
@page_image || image_url(Settings.site.meta.twitter.image)
end
def noindex?
end
end
settingslogic
上記で出てきた Settings
を使えるようにする
https://github.com/binarylogic/settingslogic gem をインストールする
読み込むymlファイルのパスを設定
class Settings < Settingslogic
source "#{Rails.root}/config/application.yml"
namespace Rails.env
end
application.ymlで全体の情報を管理
基本的にこの一箇所にすべてまとめておきたい
defaults: &defaults
# 全体ページ
site:
name: site name
root_url: https://sample.com
meta:
title: page title
description: description
keywords: sample1, sample2, sample3
webclipicon: /webclipicon.png
favicon: /favicon.ico
fb:
app_id: 9999999999
og:
title: page title
description: og description
image: /img/ogp.png
type: website
twitter:
title: page title
description: twitter description
image: /img/ogp.png
sns_account:
twitter: https://twitter.com/sample
instagram: https://www.instagram.com/sample
# 個別ページ
about:
meta:
title: about page
description: about description
keywords: about1, about2, about3
# 複数OGP
ogp:
- index: 1
title: ogp1 title
description: ogp1 description
share_description: ogp1 share_description
- index: 2
title: ogp2 title
description: ogp2 description
share_description: ogp2 share_description
- index: 3
title: ogp3 title
description: ogp3 description
share_description: ogp3 share_description
# share
share:
twitter:
text: |-
description
#hashtag description
hashtags: hashtag1, hashtag2
line:
text: |-
description
description
development:
<<: *defaults
test:
<<: *defaults
production:
<<: *defaults
トップページ以外でも表示してみる
タイトル、ディスクリプション、キーワードが変更される
- @page_title = Settings.about.meta.title
- @page_description = Settings.about.meta.description
- @page_keywords = Settings.about.meta.keywords
h1 Site#about
p Find me in app/views/site/about.html.slim
OGP量産
商品ごとにOGPを変える必要があるときなどを想定
ルーティング
ogp/にアクセスがあったら「show」アクションのみを呼ぶ
Rails.application.routes.draw do
resources :ogp, :only => [:show]
end
コントローラでymlから個別ページの情報のみを取得
配列形式で書いてあるymlから、indexが合致したOGP情報だけを取得する
class OgpController < ApplicationController
def show
@root_url = url_for("http://"+request.host_with_port+"/")
@ogp = Settings.ogp.find { |h| h['index'] == params[:id].to_i }
end
end
レイアウトをつくる
自動的に application.html.slim
のレイアウトを読みにいってしまうため、OGP用に簡素にしたレイアウトを置いておく。
doctype html
html
head
= render partial: 'layouts/meta_tags'
body
= yield
viewで個別ページを生成
このページ自体は個別のmeta情報を持たせるだけで
表示される必要はないのでルートディレクトリにリダイレクト
- @page_title = "#{@ogp["index"]}"
- @page_description = "#{@ogp["description"]}"
- @page_image = "#{@root_url}img/ogp/#{@ogp["index"]}.png"
javascript:
window.location = '/';