やっと理解できたのでメモ。uri_for_action
はドキュメントによると次のような構文になる。
$c->uri_for_action( $path, \@captures?, @args?, \%query_values? )
この“\@captures
”と“@args
”がそれぞれアトリビュートの“CaptureArgs
”、“Args
”に対応する。
例として、次のようなチェーンドアクションを考える。ユーザー情報を編集するようなページを想定している。
Path Spec |
Private |
---|---|
/user/*/*/info/*/edit/* |
/user/root (2) |
ソースはこんな感じ。
package MyApp::Controller::User; use Moose; use namespace::autoclean; BEGIN { extends "Catalyst::Controller"; } sub root : Chained( "/" ) PathPrefix CaptureArgs( 2 ) { my ( $self, $c, $arg1, $arg2 ) = @_; # まずここに来る } sub info : Chained( "root" ) CaptureArgs( 1 ) { my ( $self, $c, $arg3 ) = @_; # 次にここに来る } sub edit : Chained( "info" ) Args( 1 ) my ( $self, $c, $id ) = @_; # ここで終了 } __PACKAGE->meta->make_immutable;
このとき、次のようなURLを作成したい場合は、
http://localhost:3000/user/ARG1/ARG2/info/ARG3/edit/USER-ID
次のように書けばよい。
[%# Template::Toolkitでの例 %] [% c.uri_for_action( "/user/edit", [ "ARG1", "ARG2", "ARG3" ], "USER-ID" ) %]