10

一般来说,我仍在学习 mojolicious 和 MVC 框架,所以这可能是我正在考虑这个错误的问题,所以如果我愿意,请提出一个更好的方法来执行以下操作。

我有一条路线 /route/:param,其中有时定义了 param,有时未定义。我试图在该路由的模板中使用“param”,但我收到一条错误消息,说“param”需要明确的包名称。我知道这是由于 :param 在路由中不匹配,因为当我调用 /route/value 时一切正常。

有没有办法在定义和未定义“参数”时使用相同的模板?我只是想从“param”中定义的内容中预填充一个表单,但没有要求它。

在我的模板中

<% if(defined($param)){ %><%= $param %><% } %>

谢谢。

4

3 回答 3

20

参考 总是安全的stash("param"),其中stash定义了辅助函数Mojolicious::Plugin::DefaultHelpers

<%= stash "param" %>
<%= defined(stash("param")) && stash("param") %>
etc.
于 2013-06-05T15:12:47.273 回答
2

可以将stash(或flash)变量定义为 epl 空间/模板中的Perl变量,以便在需要时可以重用它。例如,

% if (my $param = stash 'param') {                                  
    $param
% }

在这种情况下,if 条件块仅在参数定义在stash时才会呈现,否则将被跳过。

于 2013-09-27T04:02:43.753 回答
2

在这种情况下,在路由中使用可选占位符似乎是最好的选择。如果占位符是在路由本身中定义的,并且在 url 中未给出占位符(否则使用 URL 中指定的值),则将使用该定义。

例如:

$r->any('/page/:paramVar')->to('page#doTheThing', paramVar => 'cake');

如果地址“/page”被加载,那么$self->param('paramVar') == 'cake'如果“/page/tree”被加载,那么$self->param('paramVar') == 'tree'

注意:与其他占位符值一样,可以通过 stash 函数和 param 函数访问可选占位符,例如上面示例中使用的 paramVar $self->stash('paramVar'):。

于 2015-03-28T01:47:33.277 回答