gpt4 book ai didi

perl - 为什么不调用 mojolicious Action ?

转载 作者:行者123 更新时间:2023-11-30 23:46:34 25 4
gpt4 key购买 nike

我将路由配置为:

$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状态:

The cb stash value, which won't be inherited by nested routes, can be used to bypass controllers and execute a callback instead.

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

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

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

最佳答案

虽然这并没有说明为什么在不应该调用 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;
}

提示:不要忘记返回 1

关于perl - 为什么不调用 mojolicious Action ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42831224/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com