tawara's blog

雑記。個人の見解です。

content_forとyieldと三項演算子とデフォルト引数【28/30 2nd】

こんにちは、たわらです。

本記事は、タイトルページを動的に変更したときに学習したメソッドについて紹介します。

yield メソッドと content_for メソッド

yeildメソッドは、view を挿入するべき場所を指定できます。そして、キーをつけてあげると、下記のように、yieldする場所を複数に設定できます。

application.html

<html>
  <head>
    <title><%= yield :head %></title>
  </head>
  <body>
    <%= yield %>
  </body>
</html>

content_forメソッドを使うと、名前(キー)付きの yield ブロックを生成し、一致するキーをもつyieldの場所に挿入することができます。view ファイルにこんな感じで記述します。

<% content_for(:title,'ログイン | hogeアプリ ')%>

そうすると、html 構造が、こうなります。

application.html

<html>
  <head>
    <title>ログイン | hogeアプリ</title>
  </head>
  <body>
    ・・・
  </body>
</html>

すごいですね、、、便利だ。

デフォルト引数と三項演算子

ただ、これだとページタイトルを変えるたびに、hoge | hogeアプリといちいち記述しないといけません。| hogeアプリをなんとかしたいです。

それにトップページには hogeアプリとだけタイトルに記載したいです。

そこでこんなふうに、 yield メソッドの戻り値を引数に持つメソッドを、モジュールに作成します。

application.html

<html>
  <head>
    <title><%= page_title(yield(:title)) %></title>
  </head>
  <body>
    <%= yield %>
  </body>
</html>

モジュールで作るメソッドはこんな感じ。

module HogeHelper
  #ページタイトルを返すメソッド
  def page_title(page_title = '')
  #使いやすいようにローカル変数にする
    base_title = 'hogeアプリ'

  #三項演算子の活用。
    page_title.empty? ? base_title : page_title + "|" + base_title
  end
end

で、ここで、デフォルト引数が登場しています。page_title(page_title = '')= ''ですね。

デフォルト引数というのは、メソッドの引数に何もなかったら〇〇を代入してね、ということを指示できます。

なのでこの場合、引数がなかったら空文字を入れる、という指示していることになります。

続いて、page_title.empty? ? base_title : page_title + "|" + base_titleにて三項演算子が出てきます。

三項演算子というのは、式 ? trueだった場合の処理 : falseだったときの処理と書きます。

なのでこの場合、引数の値が空か否かで処理を分けています。ログインなどの文言が入れば、ログイン | hogeアプリと自動的に入るということですね。

最後に

rails にはいろいろ便利メソッドがあるのですね。

読んでくださったかた、ありがとうございます。

参考文献

Rails ガイド

引数のデフォルト値

ActionView::Helpers::CaptureHelper

Rails: ページタイトルはビューテンプレートの`content_for`で表示すること(翻訳)