m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

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>

この場合の問題としては常に設定していないと

f:id:m_shige1979:20140816082111p:plain

こうなる

コントローラーに応じて設定しない場合もあることを考慮するとこの書き方ではダメのよう

こうする

<!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」という単語をコピペせずに入力いることにちょっと驚き、基本英語は苦手なのでスペルを覚えるのも大変だったけど意外をやっていくうちに覚えていくものだと実感した。