Perl日記

PerlとかRubyとかPHPとかPythonとか

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)