やっと理解できたのでメモ。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" ) %]
