Revel模板必须放在app/views/下且路径严格匹配控制器Action,大小写敏感;渲染时自动注入.上下文,子模板需显式传递;yield仅用于layout占位,template立即渲染;解析失败常见于routes配置、文件后缀或set语句位置错误。

模板文件必须放在 app/views/ 下,路径即路由映射关系
Revel 不会扫描任意路径的 HTML 文件,它严格按 app/views/ 目录结构匹配控制器 Action。比如 Application.Index() 方法默认查找 app/views/Application/Index.html;UserController.Show() 查找 app/views/User/Show.html。路径中大小写必须完全一致,User/show.html 或 user/Show.html 都会 404。
模板加载时自动注入 .(点)上下文,但需注意变量作用域
每个模板渲染时都接收一个 . 参数,它是控制器调用 c.Render() 时传入的数据(通常是 struct 或 map)。常见错误是:在 {{define}} 块里写 {{.Title}} 能取到值,但在 {{template "partials/_nav.html" .}} 里却为空——这是因为子模板未显式传递上下文,必须写成 {{template "partials/_nav.html" .}},漏掉末尾的 . 就等于传了 nil。
yield 和 template 的行为完全不同,混用会导致内容丢失
{{yield}} 只能在 layout 模板(如 layouts/main.html)中使用,它是占位符,等待被子模板的 {{define "content"}}...{{end}} 填充;而 {{template "xxx.html" .}} 是立即执行、同步渲染子模板。典型陷阱:在 main.html 里写了 {{template "partials/_header.html" .}} 后又写 {{yield}},结果 _header.html 渲染了两次——因为 {{define}} 块外的 HTML 会被忽略,只有 {{yield}} 区域才接收子模板内容。
模板解析失败时没有明确报错,需检查三处硬性约束
页面空白或 500 错误但控制台无日志,大概率是以下其一:
-
conf/routes中路径与控制器名/方法名不一致(如写成GET /users User.List,但实际控制器是UsersController) - 模板文件名后缀不是
.html(Revel 不识别.tpl或.gohtml) -
{{set . "key" "value"}}写在了{{template}}之后——该语句必须出现在模板最顶部,否则变量无法透传到 layout
Revel 模板解析是静态绑定的,不支持运行时动态路径拼接,所有 {{template}} 的路径都必须是字面量字符串,不能是 {{template .partialName .}} 这类表达式。


















