【问题标题】:Why Mojolicious route parameter is not rendered?为什么不呈现 Mojolicious 路由参数?
【发布时间】:2017-03-08 08:00:14
【问题描述】:

我有默认捕获值的路由:

my $api =  $r->under( '/api/v:api', [ api => qr/\d+/ ], { api => 1 } )->name( 'api' );

当我render这条路线时,我得到/api/v

$api->render; # /api/v

没关系,但是当我想强制版本渲染时,它不会被渲染:

$api->render({ api => 1 }); # RESULT: /api/v EXPECT: /api/v1

即使 1 等于默认值,我也不希望这样

为什么强制Mojolicious路由参数不渲染?

【问题讨论】:

    标签: perl mojolicious


    【解决方案1】:

    Routing Guide 中所见,当您想在同一路径段(斜杠之间)混合文本和占位符时,您需要用括号括住占位符。

    $r->under('/api/v(:api)', ...)
    

    应该可以,不过,它进一步说,一旦你有了括号形式,你就可以省略 : 所以

    $r->under('/api/v(api)', ...)
    

    应该也可以。

    【讨论】:

    • 你说的不对。括号在这里没有任何问题。问题是here。您还应该通过执行下一次检查来检查是否强制呈现宫殿持有人值:|| defined $values->{$value}
    • 尽管有这个修复会导致测试失败,但我们还是这样做了。因为该错误会导致更严重的缓存问题。假设我们有/api/v1/index.html,因为版本未渲染,此页面上的图像将渲染为/api/v/image.jpg。下次我们升级后端并实施版本 2 时。应用程序将查询/api/v2/index.html,但图像链接仍为/api/v/image.jpg。从而导致显示图像版本 1 而不是预期的版本 2。
    • 即使请求 /api/v 来了,我们也期待 /api/v1/image.jpg 被渲染
    • 我无法复制您的渲染问题:perl -Mojo -E 'my $r = app->routes; my $api = $r->any("/api/v(:api)"); say $api->render({api => 1})'(以及该模式的所有变体)对我有用。
    • 您应该提供默认值:$r->any( "/api/v(:api)", { api => 1 } )
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2013-01-30
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    相关资源
    最近更新 更多