mojolicious引用一个并不总是定义的存储变量

时间:2013-06-05 15:07:36

标签: perl mojolicious

我仍在学习一般的mojolicious和MVC框架所以这可能是一个问题,我正在考虑这个错误,所以如果我请建议一个更好的方法来做以下。

我有一个route / route /:param,其中param有时被定义,有时不定义。我试图在该路线的模板中使用“param”,但我得到一个错误,说“param”需要显式包名。我知道这是由于:param在路由中没有匹配,因为当我调用/ route / value时一切正常。

当“param”定义和未定义时,是否有办法可以为两者使用相同的模板?我只是试图预先填充“param”中定义的表单,但不要求它。

在模板中我有

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

感谢。

3 个答案:

答案 0 :(得分:17)

引用stash("param")始终是安全的,其中stashMojolicious::Plugin::DefaultHelpers中定义的辅助函数:

<%= stash "param" %>
<%= defined(stash("param")) && stash("param") %>
etc.

答案 1 :(得分:2)

在这种情况下,似乎在路线中使用optional placeholder可能是最佳选择。如果在路径本身中定义占位符,则如果在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')

答案 2 :(得分:1)

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

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

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