Mojoliciousでstashを使用する際、定義していないと…
概要
Mojoliciousではテンプレートで変数を割り当てる際はstashを使用する
サンプル
package Sample::Web::User; use Mojo::Base 'Mojolicious::Controller'; # ログイン共通 sub init { my $self = shift; # ログイン処理独自のcssを設定 $self->stash->{cssfiles} = ["user"]; } # ログインページ sub index { my $self = shift; # セッションをすべて破棄 $self->session(expires => 1); # view適用 $self->render(); } 1;
で割り当てる場合
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="/css/bootstrap.min.css"> <link rel="stylesheet" href="/css/bootstrap-theme.min.css"> <%# cssfilesが設定されている場合のみ処理を実行 %> % if($cssfiles) { % for my $css (@{$cssfiles}) { <link rel="stylesheet" href="/css/<%= $css %>.css"> % } % } <title><%= title %></title> </head> <body> <div class="header"> </div> <div class="container"> <%= content %> </div> <div class="footer"> </div> <script src="/js/jquery-2.1.1.min.js"></script> <script src="/js/bootstrap.min.js"></script> </body> </html>
この場合の問題としては常に設定していないと
こうなる
コントローラーに応じて設定しない場合もあることを考慮するとこの書き方ではダメのよう
で
こうする
↓
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="/css/bootstrap.min.css"> <link rel="stylesheet" href="/css/bootstrap-theme.min.css"> <%# cssfilesが設定されている場合のみ処理を実行 %> % if(stash->{cssfiles}) { % for my $css (@{stash->{cssfiles}}) { <link rel="stylesheet" href="/css/<%= $css %>.css"> % } % } <title><%= title %></title> </head> <body> <div class="header"> </div> <div class="container"> <%= content %> </div> <div class="footer"> </div> <script src="/js/jquery-2.1.1.min.js"></script> <script src="/js/bootstrap.min.js"></script> </body> </html>
※stashをそのまま使用することでエラーを回避できるようです
stashで定義していないことも考慮したテンプレート制御が必要な場合はstash->{xxxx}を使用する必要がありそうです。
所感
最近、「Mojolicious」という単語をコピペせずに入力いることにちょっと驚き、基本英語は苦手なのでスペルを覚えるのも大変だったけど意外をやっていくうちに覚えていくものだと実感した。