【问题标题】:Template in Mojolicious controller not found未找到 Mojolicious 控制器中的模板
【发布时间】:2022-03-16 19:41:38
【问题描述】:

我正在尝试提供包含在控制器类的__DATA__ 部分中的模板,但它似乎不起作用。

在我的主要app.pl 文件中,我有

#!/usr/bin/env perl
use Mojolicious::Lite -signatures;
use FindBin qw($Bin);
use lib "$Bin/lib";


push @{app->renderer->classes},   'Zairyo::Controller::Data';
push @{app->preload_namespaces},  'Zairyo::Controller::Data';

get '/:uid'  => [uid => qr/[a-z0-9]{32,32}/i ] => { controller => 'Data', action => 'serve_iframe' };

app->start;

Zairyo::Controller::Data

package Zairyo::Controller::Data;

use Mojo::Base 'Mojolicious::Controller', -signatures;

sub serve_iframe ($c) {
    $c->render(template => 'foo');
}

__DATA___

@@ foo.html.ep
what is this

我希望按照documentation 工作,但会在浏览器上抛出错误Could not render a response...,在日志上抛出Template "foo.html.ep" not found

我已经解决了这个问题

$c->render(inline => data_section(__PACKAGE__, 'foo.html.ep') );

但这似乎有点骇人听闻。

我在这里做错了什么?

【问题讨论】:

  • 你的问题有什么混淆吗?您使用相同的render 调用来表示它不起作用并且确实起作用。如果您预加载 Zairyo::Controller::Data 类会发生什么,因为文档说“请注意,要检测模板,这些类需要在调用 warmup 之前已经加载和添加”
  • 如果Zairyo/Controller/Data.pm 文件位于当前目录中,您可能需要将use lib '.' 添加到脚本中
  • 我也不确定app->preload_namespaces 电话,我找不到任何使用它的例子。而是试试这个:push @{app->routes->namespaces}, 'Zairyo::Controller'; 注意:没有尾随 ::Data 因为命名空间应该是一个目录,我假设Data.pmZairyo/Controller/ 目录中的一个文件
  • @briandfoy 是的 - 抱歉,我使用了有效的代码。固定的

标签: perl mojolicious


【解决方案1】:

首先,你的有些东西有点不对劲数据.pm

  • __DATA 后面应该有两个下划线和一个换行符
  • 模块不返回真值

这就是我最终得到的结果:

package Zairyo::Controller::Data;

use Mojo::Base 'Mojolicious::Controller', -signatures;

sub serve_iframe ($c) {
    $c->render(template => 'foo' );
}

1;

__DATA__

@@ foo.html.ep
what is this

在主脚本中,我在调用start 之前加载了类。请注意docs say

请注意,要检测模板,这些类需要在调用 warmup 之前已经加载和添加

而且,warmup 立即被start 调用,而关心preload_namespaces 的是warmup。你需要更早到达那里,所以preload_namespaces 对这个特殊问题没有任何帮助。如果您尚未加载该模块,则不会检测到其__DATA__ 模板。

#!/usr/bin/env perl
use Mojolicious::Lite -signatures;
use FindBin qw($Bin);
use lib "$Bin/lib";

push @{app->renderer->classes}, map { Mojo::Loader::load_class($_); $_ } 'Zairyo::Controller::Data';

get '/:uid'  => [uid => qr/[a-z0-9]{32,32}/i ] => {
    namespace  => 'Zairyo::Controller',
    controller => 'Data',
    action     => 'serve_iframe'
    };

app->start;

我不是在建议这个特定的代码,但现在我知道为什么你没有得到你想要的。

【讨论】:

  • 对不起,下划线和缺乏真正的价值。在删除(我认为是)控制器模块的不相关位(在其非剪切版本中工作)时,我把它搞砸了。非常感谢您的回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-18
  • 2019-07-04
  • 2014-11-30
  • 2014-08-01
  • 2021-10-25
  • 2018-11-26
  • 2021-12-11
相关资源
最近更新 更多