Mojoliciousのテンプレート内で現在のページを判別するには

Mojoliciousのテンプレート

基本的なMojoliciousのテンプレートは以下のテンプレートファイルがベースになることが多いです。


templates/layouts/default.html.ep

もちろん別のファイルに変更することも使わないことも可能ですが、基本形はこのファイルを大枠として、コンテンツ部分のみを別のテンプレートから読み込んでくる形になります。 なので、このdefault.html.epでは、「トップページだけバナー出したい」とか「会員ページではSNSボタン消したい」など、部分的に条件によって表示の切り分けをしたくなるわけです。

そこで、テンプレートの中で今どのページの処理をしているのかを知るための方法を、2つご紹介します。

current_route

まずは、デフォルトヘルパーに入っているcurrent_routeヘルパーです。 引数にルート名を渡すと、現在のルートかどうか判別してくれます。

<p>
    このページは
    % if( current_route 'toppage' ) {
    トップページ
    % } else {
    トップページじゃない
    % }
    です。
</p>

ここで、toppageというのは、ルーティングした際に名前付けしておいたものです。↓

~
$r->get('/')->to('home#index')->name('toppage');
$r->get('/lp1')->to('lp#type1')->name('lp1');
$r->get('/lp2')->to('lp#type2')->name('lp2');
$r->get('/contact')->to('contact#form')->name('contact');
~

現在のコントローラーとアクションから

もう一つの切り分け方法が、現在実行されているコントローラーとアクションによって振り分けるというものです。 一つのコントローラーに複数のアクションやURLが割り当てられている場合や、ルート名をつけていない場合などは、こっちの方が楽かもしれません。

例えば、先ほどのルーティングの例で、名前付けしなかったとして、/lp1または/lp2にアクセスされた時だけページの背景を赤くするclass属性を追加したい場合は、こう書けます。

~
$r->get('/')->to('home#index');
$r->get('/lp1')->to('lp#type1');
$r->get('/lp2')->to('lp#type2');
$r->get('/contact')->to('contact#form');
~
<body<% if($controller eq 'lp'){ %> class="bg-red"<% } %>>
~

アクションまで条件に含めて、/lp2の場合のみ背景を青にする場合はこう書けます。

<body<% if($controller eq 'lp' && $action eq 'type2'){ %> class="bg-blue"<% } %>>
~

もちろん、default.html.ep以外のテンプレートでも書けます。
・・が、あまり多用するとあっという間に自分でも読めないテンプレートが出来上がります。

これが難しいところなのですが、ページ数が多くなりそうなサイトやシステムの場合、URL設計やデザイン案の段階でしっかりと動きを練っておかないと、あとで追加の要素がわんさか出てきて、テンプレートがみるみるひどいことになっていきます。

メインのモジュールでURL設計(ルーティング)がそのまま書けるというMojoliciousのいいところをもってしても、設計自体がボロボロでは、知らない間にページがエラー吐いてたなんてこともありますので、十分ご注意下さいね・・!(経験済み)