Amon2で$c->render()をwrapした$c->auto_render()を作ってみた(改)
2014年7月15日
以前書いた、
Amon2で$c->render()をwrapした$c->auto_render()を作ってみた。
と、
Amon2で$c->stashを使う。
を組み合わせてみた。
まずは、$cにauto_renderを追加。
sub auto_render {
my $self = shift;
my $template = '';
if ( $self->stash->{'template'} ) {
# コントローラーで($c->stashに)templateが指定されてる場合はそっちを使う
$template = $self->stash->{'template'};
}
else {
# templateが指定されてない場合は、呼んだコントローラーと同じpathのファイルを使う
my $path = (caller 1)[3];
$path =~ s/MyApp::Web::C:://;
$path =~ s/\:\:/\//g;
$path = lc $path;
$template = $path . '.tt';
}
return $self->render($template, $self->stash );
}
テンプレートのpathのとこは、前に書いたやつとほぼ同じ。
意図的に別のテンプレートを使いたい場合もありそうなんで、$c->stash->{template}が指定されていればそっちを使うようにした。(Catalystライクな動きです)
で、コントローラ。
sub index {
my ( $class, $c ) = @_;
$c->stash->{'user_id'} = 1;
# templateもstashも送る必要なし
$c->auto_render();
}
sub info {
my ( $class, $c ) = @_;
# templateを指定したい場合。
$c->stash->{'template'} = 'info/detail.tt';
$c->auto_render();
}
/indexは、templateを指定していないのでroot/index.ttが使われる。
/infoは、templateにinfo/detail.ttを指定したので、そっちが使われる。