Rails Diary

プログラミングの学習記録です。

引数のデフォルト値

目的・備考

  • あるアプリの各ページタイトルをページごとページタイトル | アプリ名の様に動的に表示したい
  • その際、ヘルパーを用いてアプリ名のみをページタイトルにするページ、ページタイトル | アプリ名にするページを分ける判定ロジックを作りたい。

okmt-aya-26.hatenablog.com の続き

判定ロジック上の疑問

module ApplicationHelper
  def page_title(page_title='')
    base_title='ベースのタイトル'
    
    page_title.empty? ? base_title : page_title + ' | ' + base_title
  end
end 

これは

引数に書かれている(page_title='')の表記はなんなのか?

→初期値を指定しない状態でメソッドを呼び出し、かつ引数を渡さなかった場合はエラーになってしまうので、初期値として''を指定している。

以下、解説

通常の引数呼び出し
def メソッド名(変数1, 変数2)
  処理
end

# メソッドの呼び出し
オブジェクト=クラス.new
オブジェクト.メソッド名(渡す値1, 渡す値2)
初期値が設定されている場合
def メソッド名(変数1="初期値1")
  処理
end

# メソッド呼び出し
オブジェクト=クラス.new
オブジェクト.メソッド名
# メソッドを呼び出す際、渡す引数を指定しないと初期値が代わりに代入される

もしこの初期値が設定されていない状態で、メソッドを呼び出す際に引数も設定されていなければ、エラーが起きてしまう。

module ApplicationHelper
  def page_title(page_title='')
    base_title='ベースのタイトル'

    page_title.empty? ? base_title : page_title + ' | ' + base_title
  end
end

これを用いて、ページごとのタイトルを動的に表示させる

各ページへの記載

各種ページの上部に下記の記載を追加
t('.title')部分は事前に翻訳ファイルに記載したものを使用。

<% content_for(:title, t('.title'))%>

投稿の詳細ページのみ、各投稿のタイトルをページタイトルに使用する

<% content_for(:title, @post.title)%>
共通レイアウト、headへの記載
<!DOCTYPE html>
<html>
  <head>
    <title><%= page_title(yield(:title)) %></title>

↑仕組みとしては、まず各ページ上部に記載したt('.title')で翻訳された文字列がyield(:title)に代入され、ヘルパーに記載した判定ロジックに引数として渡されている。

module ApplicationHelper
  def page_title(page_title='')
    base_title='ベースのタイトル'

    page_title.empty? ? base_title : page_title + ' | ' + base_title
  end
end

この時、トップページなどタイトルを動的にする必要がない静的ページにおいてはページ上部にcontent_forの記載をしていないため、yield(:title)に代入される値がないということになる。

ここで、先ほどの初期値の設定が生きてくる。値がない場合、初期値に設定された空の文字列が代入され、page_title.empty? ? base_title : page_title + ' | ' + base_title三項演算子によって、page_title.empty?の条件式がtrueになる。

これにより、trueの際の処理base_titleが実行され、判定ロジック内で作成したbase_titleがページタイトルとして起用される。

moduleだがincludeしなくて良いのか

applicationクラスにメソッドを記載したとき、どのクラスでも使えるようになるのと同様、モジュールもapplication_helper.rbに記載されたものは自動的にinculudeされるという認識で良いのかな?

By default, each controller # will include all helpers. These helpers are only accessible on the controller through #helpers | # # In previous versions of \Rails the controller will include a helper which | # matches the name of the controller, e.g., MyController will automatically | # include MyHelper. To return old behavior set +config.action_controller.include_all_helpers+ to +false+.

翻訳

デフォルトでは、各コントローラー #すべてのヘルパーが含まれます。これらのヘルパーには、コントローラーで #helpers |を介してのみアクセスできます。 # #以前のバージョンの\ Railsでは、コントローラーにヘルパーが含まれています。 #コントローラーの名前と一致します。たとえば、 MyController は自動的に| # MyHelper を含めます。古い動作を返すには、+ config.action_controller.include_all_helpers +を+ false +に設定します。

参考にしたサイト

rails helper 基本 - Qiita

【Rails 】content_forとyieldの使い方 - Qiita