【问题标题】:Why mojolicious action is not called?为什么不叫mojolicious action?
【发布时间】:2017-03-16 10:22:02
【问题描述】:

我的路线配置为:

$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 stash 值不会被嵌套路由继承,可用于绕过控制器并改为执行回调。

/avatar 嵌套在 /me 中,cb 不应被继承,但在调度时我得到 stackcb 值。这是转储:

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

请有人澄清一下。为什么第二个cb 存在于堆栈中而 DOC 状态不应该存在?

【问题讨论】:

    标签: perl mojolicious


    【解决方案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 子将始终被调用。在这个 sub 我们设置了当前用户的参数id。所以我们可以写/users/me/avatar,而不是/users/23/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

    【讨论】:

      猜你喜欢
      • 2016-12-12
      • 2013-10-14
      • 1970-01-01
      • 2012-08-17
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-14
      相关资源
      最近更新 更多