在 Mojolicious 中将变量传递给布局模板

Passing variable to layout template in Mojolicious

我正在尝试使用存储变量设置状态页面的刷新率 所以我在控制器中有以下代码来呈现页面:

my $refreshrate = 10;
$self->stash( refreshrate => $refreshrate);
$self->render();

在 html 模板中我有:

% layout 'refreshLayout', title => 'A title';
% content_for refresh => begin
% end
<div>....body content .../<div>

在布局模板中我有:

<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
    <meta charset="UTF-8"/>
    <meta http-equiv="refresh" content="<%= refreshrate %>"/>
        .....
    <title><%= title %></title>
 </head>
  <body><%= content %></body>
</html>

我总是以刷新元标记的内容属性中没有值的呈现页面结束。 refreshrate 替换似乎不起作用。 但是 contenttitle 替换都有效。

那么我做错了什么? 当我们在这里时,为什么在布局模板中我们确实使用 <%= content %> (而不是 $content) 而在常规页面的模板中,我们使用更符合逻辑的 <%= $variable %> 布局模板中的替换与主页模板中的替换如何工作?

隐藏值在您的模板中显示为 perl 变量。 (title 是特殊的,因为它也是默认的辅助函数)。 如果你想将刷新率的存储值传递给布局,你必须将它添加到你的 layout() args:

use Mojolicious::Lite;

get '/' =>  sub  {
    my $c = shift;
    $c->stash (refreshrate => 10),
    $c->render(template => 'foo/bar')};

app->start;
__DATA__

@@ foo/bar.html.ep
% layout 'mylayout', title => 'Hi there',refreshrate => $refreshrate;
Hello World!

@@ layouts/mylayout.html.ep
<!DOCTYPE html>
<html>
    <head>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
    <meta charset="UTF-8"/>
    <meta http-equiv="refresh" content="<%= $refreshrate %>"/>
    <title><%= $title %></title></head>
  <body><%= content %></body>
</html>

参见Rendering doc

中的布局