Catalystのアクションの優先度でまたもはまったのでメモ。
最上位のコントローラー(要するにcatalyst.plでつくられる)にRegexでアクションを定義すると、script/xxxx_create.pl controller test とかでlib/Controllerの下に作成したtest.pmのデフォルトよりも優先されてしまう。
例えば
lib/Test.pm
sub Regex : Regex('^(¥w+)$'){ my ( $self, $c ) = @_; # Hello World $c->response->body($c->req->snippets->[0]); }
lib/Test/Controller/priv.pm
sub default : Private { my ( $self, $c ) = @_; $c->response->body( "Test::Controller::priv" ); }
とかやっておいて、/privにアクセスするとRegexが実行されてしまう。
色々悩んだ挙句、
sub priv : Path('/priv'){ my ( $self, $c ) = @_; $c->response->body( "Test::Controller::priv" ); }
みたいに、Pathでルートからの位置を指定して優先度をあげることで解決。せっかくControllerで別にしてるんだから、
コントローラー内のデフォルトはコントローラー内ではデフォルトの動作をしてほしいナァ
Regexに持ってかれちゃったりすると気持ち悪いなぁと思ったり。
あと試行錯誤してて気づいたんだけど最上位のコントローラーでLocalRegexを指定すると何にもマッチしないようなんだけどこの認識であってるのかな?