引数のデフォルト値
目的・備考
- あるアプリの各ページタイトルをページごと
ページタイトル | アプリ名
の様に動的に表示したい - その際、ヘルパーを用いて
アプリ名
のみをページタイトルにするページ、ページタイトル | アプリ名
にするページを分ける判定ロジックを作りたい。
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 +に設定します。