使用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!
现在做得好多了[=