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を指定したので、そっちが使われる。