Hatena::Grouptenmon

ひこにっき

 | 

2012.02.16

Mojoliciousでデフォルトのstashを設定する

19:24

要するに now => DateTime->now をstashに設定しておきたい話。デフォルトテンプレートエンジン(Mojo::Template)を使っている場合は、helperに設定すればいいだけなのだが、Text::Xslateを使っているときは、どうもそうは行かないらしい。

dispatchやrenderをオーバーライトしてしまおうかとも考えたが、そこまでしなくてもなんとかなる。

package MyApp;
use Mojo::Base 'Mojolicious';
use DateTime;

sub startup {
    my $self = shift;
    my $r = $self->routes;
    $r = $r->under( sub { shift->stash( now => DateTime->now ) } );
    $r->route('/:controller/:action')->to('default#default');
}

1;

チュートリアルに認証の例があるが、それを全体に適用している。underは新しいroutesを返すので、そこに対してルールを設定する。

defaultsじゃダメなのか

リクエストごとに更新して欲しいので、下記ではうまく行かないらしい。

    # :
    $self->defaults( now => DateTime->now );
    # :

Mojo::Templateの時は

helperに入れるだけ。

    # :
    $self->helper( now => sub { DateTime->now } );
    # :
<%= now->ymd %>

hook

hookも見つけたので次のエントリに書いた。hookのほうが素直な感じがする…。

トラックバック - http://tenmon.g.hatena.ne.jp/aql/20120216
 |