2017-03-16 203 views
3

我已經配置的路由爲:爲什麼mojolicious行動不被稱爲?

$rn = $rn->any('/users', sub{ my $c = shift; $DB::single = 1; 1; }); # first cb 
$rn = $rn->any('/me',  sub{ my $c = shift; $DB::single = 1; 1; }); # second cb 
$rn = $rn->any('/avatar')->to('avatar#test');       # action 

當我請求GET /users/me/avatar我得到的是執行第二個回調。

但我預計要運行avatar#test動作。

我很困惑。 DOC指出:

cb存儲值不會被嵌套路由繼承,可用於繞過控制器並執行回調。

/avatar嵌套到/mecb不應該被繼承,但在分發時,我得到stackcb值。這裏是轉儲:

[ 
    { action => "test", cb => sub { ... }, controller => "avatar" }, 
] 

請有人請澄清。什麼爲什麼第二cb目前在堆棧而DOC的狀態不應該?

回答

1

雖然這並不能說明爲什麼cb不應該被調用。我們可以採取控制有點過分的是:

$rn = $rn->any('/users'); 
$rn = $rn->any('/:id', \&setup_id)->inline(1); # Enable: /users/me/avatar 
$rn = $rn->any('/avatar')->to('avatar#test'); 

inline選項強制setup_id子將總是叫。在這一部分,我們設置當前用戶的參數id。因此,而不是/users/23/avatar我們可以寫/users/me/avatar

sub setup_id { 
    my $c = shift; 
    my $id = $c->param('id'); 
    # TODO: Should we replace $c->stash->{ id } too? 
    $c->param(id => $c->uid) if $id && $id eq 'me'; 
    return 1; 
} 

提示:不要忘記return 1

相關問題