現在5人チームでRailsを使ってcookpadのクローンを実装しています。
共通ページの見た目の部分はapplication.html.hamlに記述するのですが、ページによっては違う表示をしたい場合があります。
例えば、
通常、ほとんどのページで上の部分のように表示したいが、一部のページでは
このように上部分のビューを変えたい。
特にログインページや新規登録ページなどはそうですね。
今回は簡単に表示したいページをif文を使って実装する方法をお伝えします!
Contents
current_page?を使ってif文で分けてみよう!
結論からいくとこの一行を追加するだけ。
application.html.haml
- if %w[user_session new_user_registration].any? { |name| current_page?(send("#{name}_path")) }
user_session
とnew_user_registration
はログインページと新規登録ページへのパスです。
今回はログインページと新規登録ページだけ違うビューを表示したかったので、ここに記述します。
current_page?メソッドを使えば良いのはなんとなくわかってもこれは1ページだけにしか使えない。
複数ページを表示したい場合に下のようにしてはうまくいかないです。
current_page?(root_path, ◯◯_path, □□_path)
複数ページを表示したい場合は%w[].any?
を使います!
%w[]とany?メソッドの組み合わせについて
%W[]とは
%Wは%記法の一種でwはwhitespaceの略。つまり空白を使って配列を作ってくれます。
書き換えるとこうなります。
%W[user_session new_user_registration
] =>
["user_session", "new_user_registration"]
このように配列で返します。
any?メソッド
any?メソッドは、後ろの記述の{|name| }の中のnameに繰り返し要素を入れてくれて、trueを返したら処理を止めてくれます。
これで前半部分のif %w[user_session new_user_registration].any?
と記述をすれば、配列の中のuser_session と new_user_registration
を順番に{ }の中のnameに入れてcurrent__page?メソッドでtrueを返したら処理が止まります!
{ |name| current_page?(send("#{name}_path")) }
について
current_page?メソッドについて
current_page?メソッドを使うことで引数にしたパスが表示中のページと同じかどうかを判定してくれています。同じであればtrueを返します。
しかし、引数が"#{name}_path"
だと文字列になってしまうという問題が発生してうまくいきません。
そこで、sendメソッドが登場します。
sendメソッドについて
sendメソッドは、引数に文字列かシンボルを与えてやると同じ名前のメソッド名に引っ張り出してくれます!
このsendメソッドを記述することで文字列の問題を解決。
これで完成です!
あとは、その他の共通ページはelse以下に表示すれば大丈夫です!