今日はRailsプログラミングの調べ物をしました。
テックアカデミーの掲示板で質問すればすぐ答えは得られると思いますが、自力で解決できそうと思いまして。
やりたいことは
・「application.html.erb」を読まずに表示する方法
・タイトルタグやメタタグをページごとに変える方法
この2つです。applicationレイアウトの整理をしつつ各方法を書いていきます。
application.html.erbには何が書いてあるか?
Railsではコントローラーのアクションを経由してHTMLファイルを読み込み表示する時に必ずviews/layouts/application.html.erbを読みます。
なのでapplication.html.erbの中に以下のように記述してあります。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>俺のRailsプログラミング</title> <%= csrf_meta_tags %> <!-- Bootstrap CSS--> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> <!-- app/assets/stylesheets --> <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> <!-- app/assets/javascripts--> <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> <!-- Bootstrap JavaScript--> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> </head> <body> <div class="container"> <%= yield %> </div> </body> </html>
bodyタグの下がコンテンツになりますが、yieldというメソッドを呼んでいます。
それで各ページに記述した内容がこのyieldに埋め込まれてブラウザの画面に表示される形です。
イメージとしては、全ページ共通でこのapplication.html.erbで枠を作って、yieldの部分だけ各個別ページのオリジナルのコンテンツや記事が入ってくるイメージです。
ただしこのままapplication.html.erbを使っていると、記事毎のタイトルタグの部分
各ページでタイトルを変更する方法
全ページが同じタイトルだとおかしなサイトになってしまいます。SEO的にもよろしくない。なので各ページ毎にタイトルを用意しますのでapplication.html.erbのtitleタグの部分を以下のように修正します。
<title><%= page_title %></title>
ここではpage_titleというメソッドを呼ぶようにしています。ビュー側で新たに定義するメソッドはヘルパーに記述する慣習がありますので/app/helpers/application_helper.rbを修正しpage_titleメソッドを定義します。
module ApplicationHelper def page_title title = "俺のRailsプログラミング" #これがサイトのブランド名 title = @page_title + " | " + title if @page_title title end
1行目ではサイトのトップページのタイトルを定義して代入しています。一般的にはサイトのブランド名を設定すると良いでしょう。
理想的なタイトルの付け方を伝授
私はどちらかというとSEOのほうが専門なのでここで小話を。
※このようなトップページタイトルの付け方が望ましいとされています。
ブランド名 | サイトの説明
例)
俺のRailsプログラミング | 初心者が一念発起してプログラマを目指すブログ
真ん中の|はパイプと呼びます。半角スペース パイプ 半角スペースとします。パイプじゃなくて半角のハイフン – でも構いません。日本ではパイプが主流で海外だとハイフンが多い気がします。
で、個別ページ(下層ページ)は以下のようなタイトルの付け方をすると良いでしょう。
個別ページのタイトル | ブランド名
例)
Railsで挫折しない心構え5つ | 俺のRailsプログラミング
で、Railsでもこの名付け方にならって先程のpage_titleメソッドを定義しました。
@page_titleというのは、個別ページ内で定義する個別ページのタイトルです。
なので例えばshow.html.erbの出だしで以下のように@page_titleを定義します。
<% @page_title = 'Railsで挫折しない心構え5つ' %>
これで個別ページごとにタイトルを設定することができるようになりました。
ヘッダーやヘッダー画像やフッターを作る
僕はこのように呼んでいますが、Railsの世界ではナビバーとかカバーとか言うのかもしれない。
要はヘッダーはサイトの画面上部のメニューとか画像の共通部分。ココにメニューがあるとグローバルメニューと言ったりする。
フッターは皆共通に知ってる画面最下部の部分を呼ぶ。
application.html.erbに、共通化できる部分を入れます。現状僕のapplication.html.erbは以下のようになっています。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title><%= page_title %></title> <%= csrf_meta_tags %> <!-- Bootstrap CSS--> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> <!-- app/assets/stylesheets --> <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> <!-- app/assets/javascripts--> <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> <!-- Bootstrap JavaScript--> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> <!-- slick photo slideshow --> <%= yield :header %> </head> <body> <%= render 'layouts/navbar' %> <%= yield :cover %> <div class="container"> <%= render 'layouts/flash_messages' %> <div class="row"> <!-- 左コンテンツ --> <div class="col-md-9 left-contents"> <%= yield %> </div> <!-- 右サイドメニュー --> <div class="col-md-3"> <%= render 'layouts/side_menu' %> </div> </div> </div> <%= render 'layouts/footer' %> </body> </html>
新たに出てきたのがこれら。
<%= yield :header %> <%= render 'layouts/navbar' %> <%= yield :cover %> <%= render 'layouts/side_menu' %> <%= render 'layouts/footer' %>
1行目は個別ページごとにheadタグ内部に入れたいものがあれば、ここに記述します。メタタグとかの記述はここ。
2行目はナビバーを用意して読み込んでいます。ナビバーにはサイトのロゴ画像とか、ログインボタン等があります。
3行目はここにヘッダー画像やH1タグを読み込んでいます。またSEOの話ですがH1タグもページごとに違って当たり前なので、個別ページ毎に設定しますからyieldを使っています。
4行目はここでサイドメニューを表示しています。
5行目がフッターですね。メニューとかコピーライトとかを記述します。
そうすると個別ページは以下のようにします。
<% @page_title ='Railsで挫折しない心構え5つ' %> <% content_for :header do %> <meta name="keywords" content="Rails,プログラミング" /> <meta name="description" content="このページではRails歴3年の私がRailsプログラミンで重要な考え方をご紹介します。" /> </div> <% content_for :cover do %> <img src =""> <h1>Railsで挫折しない心構え5つをご紹介!</h1> <% end %> <h2>はじめに</h2> <p>Railsを3ヶ月学習してきて‥</p> ‥ ‥
このようにして枠に当てはめていきます。
application.html.erbを使いたくない場合
まるっきりapplication.html.erbの枠にはめたくない場合はコントローラーのアクションに以下のように記述する必要があります。
def index #indexの中身記述 # : # : render layout: false #application.html.erbを適用したくない end
これで飛んだ先のindex.html.erbファイルは全部書かないといけなくなりますが。
自分がいま作成中のWEBアプリはトップページは1カラムで、個別ページは2カラムでやりたいと思っているのでこのようにしています。