找不到 Mojolicious 控制器中的模板
Template in Mojolicious controller not found
我正在尝试提供包含在控制器 class 的 __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') );
但这似乎有点乱。
我做错了什么?
首先,您的 Data.pm:
__DATA
后面有三个下划线,本来应该有两个下划线和一个换行
- 模块没有return真值
这是我最终得到的结果:
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
之前加载了 class。请注意 docs say:
Note that for templates to be detected, these classes need to have already been loaded and added before warmup is called
而且,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;
我不是在建议这个特定的代码,但现在我知道为什么你没有得到你想要的。
我正在尝试提供包含在控制器 class 的 __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') );
但这似乎有点乱。
我做错了什么?
首先,您的 Data.pm:
__DATA
后面有三个下划线,本来应该有两个下划线和一个换行- 模块没有return真值
这是我最终得到的结果:
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
之前加载了 class。请注意 docs say:
Note that for templates to be detected, these classes need to have already been loaded and added before warmup is called
而且,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;
我不是在建议这个特定的代码,但现在我知道为什么你没有得到你想要的。