forwardとdetachとvisitとgo
まだまだCatalyst。
Controllerクラスで、$c->forward()と$c->detach()は、制御が帰ってくるかどうか(返ってくるかどうか)の違いだと覚えていた。
まあそれはあっているんだけれど、他にも違いがあった。
Controller/Login.pm
sub index :Path :Args(0) { my ( $self, $c ) = @_; $c->forward('/login/form'); # or # $c->detach('/login/form'); } sub form :Local { my ( $self, $c ) = @_; $c->stash->{message} = 'ok!'; }
root/login/form.tt
<html>[% message %]</html>
この状態で「/login/」にアクセスすると、以下のエラーになる。
Couldn't forward to command "/login/form": Invalid action or component
つまりは、テンプレートがないと言われているのだ。
逆にform.ttをindex.ttに置き換えるとうまくいく。
あるいは、formアクションの中で、
sub form :Local { my ( $self, $c ) = @_; $c->stash->{message} = 'ok!'; $c->stash->{template} = 'form.tt'; }
とすればよい。
が、なんだか直感に反するな…。
ということで、出てくるのが、visitアクションと goアクション。
まだよくわからないけれど、テンプレート名が渡し先の方を使ってくれるverの forward と detach ということでいまは覚えている。
sub index :Path :Args(0) { my ( $self, $c ) = @_; $c->visit('/login/form'); # or # $c->go('/login/form'); } sub form :Local { my ( $self, $c ) = @_; $c->stash->{message} = 'ok!'; }
visit は制御が戻るけれど、go は戻ってこない。
root/login/form.tt を用意して、「/login/」にアクセスすればちゃんと「ok!」が出た。
よかったよかっためでたしめでたし。
と思う。
参考:
404 Not Found初めてのCatalyst入門(5) フロー制御とChainedアクション (2/5):CodeZineバックボーンレスハム[ThinkIT] 第4回:Catalystの最重要オブジェクト (1/2)