使用response.render呈现模板文件时,请将变量与Vibe.d一起使用
目前,我正在使用它来创建一个网站,它有一个使用response.render呈现模板文件时,请将变量与Vibe.d一起使用,d,vibed,D,Vibed,目前,我正在使用它来创建一个网站,它有一个响应类,可以处理每个请求。看起来是这样的: import vibe.d; void index(HTTPServerRequest req, HTTPServerResponse res) { res.render!("index.dt", req); } shared static this() { auto router = new URLRouter; router.get("/", &index); auto set
响应
类,可以处理每个请求。看起来是这样的:
import vibe.d;
void index(HTTPServerRequest req, HTTPServerResponse res)
{
res.render!("index.dt", req);
}
shared static this()
{
auto router = new URLRouter;
router.get("/", &index);
auto settings = new HTTPServerSettings;
settings.port = 8080;
listenHTTP(settings, router);
}
在本例中,我将向res.render!
方法传递一个const string
“index.dt
,但我想传递一个变量:
void render(string action, HTTPServerResponse res) {
res.render!(action);
}
但我得到了以下错误:
Error: variable action cannot be read at compile time
在我调用的每个点render
,我都硬编码了字符串:
render("foo.dt");
但这并不能满足编译器的要求。你知道我如何才能做到这一点吗?你不能。饮食模板在编译过程中是完全预处理的,所以有必要知道饮食模板文件名作为编译时常量。你可以将任意数量的变量参数传递给要动态处理的模板,但模板文件本身是严格的编译时间
在运行时呈现模板的选项已被多次询问,并在概念上得到批准,但未被积极使用。使用运行时变量时,原则上是不可能的(这基本上需要在运行时编译D代码),您可以使用编译时定义的
enum
常量或模板参数来避免直接使用字符串常量:
void index(string templ)(HTTPServerRequest req, HTTPServerResponse res)
{
res.render!(templ, req);
}
shared static this()
{
// ...
router.get("/", &index!"index.dt");
// BTW, this special case is equal to
//router.get("/", staticTemplate!"index.dt");
// ...
}
或使用枚举
:
enum indexTemplateFile = "index.dt";
void index(HTTPServerRequest req, HTTPServerResponse res)
{
res.render!(indexTemplateFile, req);
}
使用命名的枚举的这种替代形式也可用于:
enum TemplateFile {
index = "index.dt",
login = "login.dt"
}
void index(HTTPServerRequest req, HTTPServerResponse res)
{
res.render!(TemplateFile.index, req);
}
这两种方法也可以结合使用,甚至可以使用常用的字符串操作修改常量,只要结果仍然可以在编译时计算(例如,在将字符串传递到渲染之前,可以调用字符串上的std.string.toLower
).谢谢你的回答。我知道render!
现在做得好多了[=