同一 Action 名の Path Spec を実装するには Chained を使う
/hoge/*
今まで上記のような Path Spec を実装するときは
sub hoge : Args(1) {
my $self = shift;
my ($c, @args) = @_;
}
こんな感じでやってた。
/hoge /hoge/* /hoge/*/*
で、今回はこういう Path Spec を実装したかったので
同じようにだけでできるかと思ってやったら
dispatch されなくなってできなかった。
sub hoge : Args(0) {
my $self = shift;
my ($c) = @_;
}
sub hoge : Args(1) {
my $self = shift;
my ($c, @args) = @_;
}
sub hoge : Args(2) {
my $self = shift;
my ($c, @args) = @_;
}
で、それを sasata299 が解決してくれた。GJ
Chained を使えばいいらしい。
sub chain : Chained('/') PathPart('') CaptureArgs(0) {
my $self = shift;
my ($c) = @_;
}
sub hoge1 : Chained('chain') PathPart('hoge') Args(0) {
my $self = shift;
my ($c) = @_;
}
sub hoge2 : Chained('chain') PathPart('hoge') Args(1) {
my $self = shift;
my ($c, @args) = @_;
}
sub hoge3 : Chained('chain') PathPart('hoge') Args(2) {
my $self = shift;
my ($c, @args) = @_;
}
chained の使い方については sasata299 が
まとめてくれているので分かりやすかった。
CatalystのChainedアクションを使いこなすための3つのルール
また CatalystのChainedアクションの連鎖を止める方法 このエントリーも併せてみとくといいかも。
多謝多謝
追記 2009-05-19 12:50:11
id:typester さんに Path アクションでやる方法を教えてもらった。(TL)
sub hoge1ath('hoge') :Args(2) { my $self = shift; my ($c) = @_; } sub hoge2
ath('hoge') :Args(1) { my $self = shift; my ($c, @args) = @_; } sub hoge3
ath('hoge') :Args(0) { my $self = shift; my ($c) = @_; }
さらに注意点も教えてもらった。
以下 TL の引用。
- Pathアクションは同じパスだと後から書いた方が優先されるので、Argsは多い順に定義しないとダメ
- Args多いのを後から書くとそれに全部持って行かれる
- さらにちなむと index
ath とか default
ath とかはどこに書いても優先されるけど、これは専用のDispatchTypeがあり、Pathアクションではないのです
勉強になった。色々な方法があってやっぱおもしろい。
ありがとうございました〜