MVCその8.5
少し続き。
Contorollerだけど、わざわざ
$c->stash->{template} = 'index.tt';
なんてしなくてもよいことを思い出した。
Catalystやってみた - Perl日記
以前にやってた。
というかここで何をやっていたかというのがやっと分かった次第。
つまりは、Controllerでディスパッチした中でテンプレートが指定されていなかったら(bodyがなかったらともいうのかな)、そのアクション名をテンプレートファイル名として使用する、ということ。
テンプレートの拡張子は、TTクラスで指定する。(デフォルトで'.tt'でされてた。)
lib/MyHatena/Web/View/TT.pm
package MyHatena::Web::View::TT; use strict; use warnings; use base 'Catalyst::View::TT'; __PACKAGE__->config(TEMPLATE_EXTENSION => '.tt');
ゆえに、前回のControllerはその点を省略してこう書ける。
lib/MyHatena/Web/Controller/Root.pm
sub index :Path :Args(0) { # my ($self, $c) = @_; # $c->stash->{template} = 'index.tt'; }
書けるというか書いてないというか。
まあDocRootの最初の最初ということで、別にサブルーチンの名前は index() じゃなくてもディスパッチされるのだけれど、お決まりごと的におまじない的に、index()という名前にして、index.ttをテンプレートとするようにしている。
lib/MyHatena/Web/Controller/Search.pm
sub search :Path('/search') { my ($self, $c) = @_; my $result = $c->model('Tag::Search')->search($c->req->param('search_tag')); # $c->stash->{template} = 'search.tt'; $c->stash->{result} = [$result->entries]; $c->stash->{search_tag} = $c->req->param('search_tag'); }
コメントアウトのこれだけでいいかなと考えていたけれど、よく見たらSearch.pmのsearchアクションなので、このままだとTTは root/search/search.ttを見に行ってしまう。(そうするべきなのかもだけど)
root/search.ttをテンプレートとして使いたいので、何とかしないといけない。
要は名前空間に対する相対関係をなくせばいいわけだ。
__PACKAGE__->config(namespace => '');
うーん。
これをSearch.pmの上の方に入れてみたものの、なんだろ、Root.pmでもnamespace消し去ってるし、あんまり良くないのかな?、これ……。
何か設定できそう。