Revel模板路径必须严格匹配控制器包路径、类名和方法名,大小写敏感且后缀仅限.html;Layout.html须置于app/views/根目录,partials须在app/views/partials/;模板禁止业务逻辑,静态资源须用/assets/路径。

模板文件必须严格匹配控制器路径和方法名
Revel不会自动扫描或模糊匹配视图,app/views/ 下的目录结构必须与控制器包路径、类名、方法名完全一致,否则渲染时静默失败,只返回空白页或 500 错误,日志里通常只写 template not found,不提示缺哪一级。
例如:app/controllers/admin/UserController.go 中定义了 func (c Admin) List() revel.Result,对应模板路径必须是 app/views/admin/Admin/List.html —— 注意不是 admin/User/List.html,因为控制器类型名是 Admin,不是 User;也不是 app/views/Admin/list.html(小写)或 List.tpl(错误后缀)。
- 控制器类名首字母大写 → 视图目录名也必须首字母大写
- 方法名首字母大写 → 模板文件名必须完全相同(大小写敏感),且后缀只能是
.html - 子包路径(如
api/v2)必须逐级映射到app/views/api/v2/,漏掉v2就找不到
用 Layout + Partials 实现多层复用,但布局文件位置有硬约束
Revel 支持 {{yield}} 布局继承,但 Layout.html 必须放在 app/views/ 根目录下,不能放 app/views/layouts/ 或其他子目录——否则 {{template "layouts/main.html" .}} 这类写法会失败,框架根本不识别该路径。
公共区块(如导航、侧边栏、分页)应统一放进 app/views/partials/,再用 {{template "partials/_nav.html" .}} 调用。这个 partials 是约定目录名,不能写成 components 或 includes,否则 revel 不会扫描它。
-
app/views/Layout.html是唯一被自动识别为全局布局的文件名 - 所有
{{template}}路径都是相对于app/views/的,不支持../或绝对路径 - 区块模板里禁止调用
revel包函数(如revel.RenderJSON),只允许安全函数(DateFormat、SafeHTML)
复杂页面需要提前计算状态,模板里别做逻辑分支
Revel 模板语法本身不禁止 {{if}},但官方明确要求 View 层“零业务逻辑”。一旦在模板里写嵌套超过两层的 {{if}} 或手动拼接 URL/权限判断,就容易导致:渲染慢、测试难覆盖、Flash 消息丢失、甚至 CSRF Token 漏传。
正确做法是在 Controller 方法里把所有展示逻辑收口:布尔标志位(CanEdit、IsOwner)、预处理列表(RecentBooks)、分页元信息(Pagination)全部作为字段塞进 c.Render(...) 的数据结构中,模板只做 {{if .CanEdit}} 这种单层判断。
- 不要在模板里调用
.User.Role == "admin",而应在 Controller 中计算IsAdmin := user.Role == "admin"并传入 - 避免
{{range $i, $book := .Books}}{{if eq $i 0}}...{{end}}{{end}}这类索引控制,改用FirstBook字段 - Flash 消息(
c.Flash.Error("xxx"))必须通过c.Render()显式传给模板,不能靠中间件隐式注入
静态资源路径和热重载陷阱直接影响模板调试体验
开发时访问 /public/css/app.css 返回 404?不是文件没放对,而是 Revel 默认把 app/public/ 映射到 /assets/ 路由前缀。你写了 <link href="/public/css/app.css">,浏览器实际请求的是 http://localhost:9000/public/css/app.css,而服务器只响应 /assets/css/app.css。
更隐蔽的问题是:修改 app/public/ 下的 JS/CSS 文件,Revel 热重载不会触发重启,浏览器缓存又容易生效,导致你反复刷新却看不到样式更新。这不是 bug,是设计如此——热重载只监听 app/ 和 conf/ 目录。
- 静态资源引用一律用
/assets/xxx,且文件必须放在app/public/下(不是public/根目录) - 改 CSS/JS 后务必手动强制刷新(Ctrl+Shift+R),或禁用浏览器缓存调试
- 模板中引用图片、字体等资源时,路径也必须以
/assets/开头,不能用相对路径(如../img/logo.png)
app/views/ 路径是否全对、conf/routes 是否声明了对应 Action、浏览器 Network 面板里有没有 404 的 /assets/ 请求。


















