del.icio.usはhttp://del.icio.us/ユーザー名でそのユーザー名のブックマークを表示できるようになっているが、その他にpostとかtagとかユーザー名以外の情報も存在してます。
そんなわけで、ユーザー名(pathの第一引数?)みて処理を分ける必要がある。
CatalystはPath,Regex.TopLevelというアクションがサポートされていて、
普通PathのほうがRegexより優先度高いだろという認識でコード書いたら、うまく動かなかった、というか職場で使っていたCatalystはRegexのほうが優先度が高かったので、結局Regexのサブルーチンの中でユーザー名が"tag"とか"post"だったらそういう処理にforwardするみたいな条件分岐を書いたのだ。
なんかif文ぐりぐり地獄になっちゃった。
納得いかないので、家のCatalyst(5.65)で次のコードを書いて確認してみた。
sub default : Private { # Private
my ( $self, $c ) = @_;
$c->response->body( $c->welcome_message );
}
sub tag : Path('tag') { # Path
my ( $self, $c ) = @_;
$c->response->body( "Taggggg" );
}
sub pop_path : Path('popular') { # Path
my ( $self, $c ) = @_;
$c->response->body( "Popular" );
}
sub popular : Global {# Top Level
my ( $self, $c ) = @_;
$c->response->body( "!top level!" );
}
sub user : Regex('^(\w+)$') { # Regex
my ( $self, $c ) = @_;
my $user = $c->req->snippets->[0];
$c->response->body( "Tag list: $user" );
}
結果は
TopLevel > Path > Regex > Default
と納得のいく優先度が得られたヨ。職場のCatalystのバージョン古かったせいなのか、書き方に問題あったのかナァ。来週確かめよう。