revel 模板路径匹配严格遵循大小写敏感的命名约定:控制器名、包路径、视图目录名、方法对应文件名(小写+.html)及layout.html/404.html位置均须逐字符一致,否则静默失败。

Revel 模板不会“自动猜测”路径,它只按严格约定在固定位置查找文件;不满足命名或目录结构,就返回空白页且不报错。
控制器名和视图目录必须大小写完全一致
Revel 扫描 app/views/ 下的子目录时,目录名必须与控制器结构体名**逐字符匹配**,包括首字母大写。例如:
- 控制器定义为
type HomeController struct { *revel.Controller }→ 视图目录必须是app/views/Home/,不是home或HOME - 若控制器在子包如
admin.UserController→ 目录必须是app/views/admin/User/,漏掉admin/或写成Admin/都会导致找不到 - 路径层级必须与包路径完全对齐:控制器在
api/v2/PostController→ 视图路径必须含api/v2/Post/,不能省略v2
方法名到文件名需小写 + .html 后缀
控制器中声明的方法名(如 Dashboard)对应模板文件名时,必须转为全小写并加 .html 后缀:
-
func (c App) Dashboard() revel.Result→ 文件名必须是app/views/App/Dashboard.html - 不是
dashboard.html(大小写错)、Dashboard.tpl(后缀错)、Dashboard.gohtml(Revel 不识别) - Revel 只认
.html,且区分大小写;Linux 环境下dashboard.html和Dashboard.html是两个不同文件
Layout.html 必须放在 app/views/ 根目录且首字母大写
布局复用依赖一个硬性规则:全局 Layout 模板只能放在 app/views/ 根目录,且文件名必须是 Layout.html(L 大写,.html 小写):
- 写成
layout.html、LAYOUT.html或layouts/Layout.html都无效 - 如果想用其他名字(如
MainLayout.html),就必须在每个页面里显式调用{{template "MainLayout.html" .}},无法被 {{yield}} 自动识别 - Revel 不会扫描子目录找 Layout,也不会 fallback 到其他命名;缺失或命名错误,{{yield}} 无效果,内容直接丢失
404.html 必须放在 app/views/errors/ 且配置项不能有空格
自定义 404 页面要生效,两个条件缺一不可:
-
app/views/errors/404.html文件必须存在——Revel 不会自动创建errors/目录,手工漏建即失效 -
conf/app.conf中必须有results.error.404 = 404.html,且等号两侧要有空格;写成results.error.404=404.html或results.error.404 = errors/404.html都不触发 - 该配置仅在
run.mode = prod下生效;dev 模式下无论怎么配,都只显示调试堆栈
最常被忽略的是大小写和目录层级——Revel 的匹配逻辑不带容错,也不输出路径诊断信息;一旦出问题,只能靠手动比对控制器名、包路径、目录名、文件名四者是否逐字符一致。











