content_forとyieldと三項演算子とデフォルト引数【28/30 2nd】
June 11, 2020
こんにちは、たわらです。
本記事は、タイトルページを動的に変更したときに学習したメソッドについて紹介します。
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 にはいろいろ便利メソッドがあるのですね。
読んでくださったかた、ありがとうございます。