Drkcore

04 03 2006 Catalyst Tweet

Catalystのアクションの優先度

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のバージョン古かったせいなのか、書き方に問題あったのかナァ。来週確かめよう。

About

  • もう5年目(wishlistありマス♡)
  • 最近はPythonとDeepLearning
  • 日本酒自粛中
  • ドラムンベースからミニマルまで
  • ポケモンGOゆるめ

Tag

Python Deep Learning javascript chemoinformatics Emacs sake and more...

Ad

© kzfm 2003-2021