2017-03-16 201 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

相关问题