Revel模板中页脚复用必须用partials目录+template指令引入;需将页脚存为app/views/partials/_footer.html,主布局中用{{template "partials/_footer.html" .}}调用,路径须带partials/前缀,且静态资源用绝对路径、多语言键需匹配messages文件并启用I18nFilter。

Revel模板中页脚复用必须用partials目录 + template调用
Revel本身不支持组件化导入,页脚复用只能靠template指令加载命名模板,且所有相关文件必须在同一个template.Template实例中解析,否则会报template: footer.html is not defined。
标准做法是把页脚单独抽成app/views/partials/_footer.html,再在主布局里用{{template "partials/_footer.html" .}}引入。注意路径必须带partials/前缀,因为Revel的ParseFiles默认按文件系统路径注册模板名。
-
_footer.html文件名建议以下划线开头,避免被误当作可直接访问的页面模板 - 所有
partials/下的文件必须和layouts/main.html一起被ParseFiles加载——Revel默认已做到这点,无需手动干预 - 传参时默认继承当前上下文,比如
.CopyrightYear在主模板里设过,页脚里就能直接用{{.CopyrightYear}}
页脚模板里引用静态资源要写绝对路径
页脚常含版权链接、JS统计代码或小图标,这些资源若用相对路径(如../img/logo.png)会因调用位置不同而404。Revel只认/assets/或/开头的路径。
- CSS/JS必须放
app/public/下,页脚中写<link rel="stylesheet" href="/css/footer.css"> - 图片路径统一用
/img/xxx.png,对应物理路径是app/public/img/xxx.png - 不要在页脚里写
public/css/或./css/——Revel不处理这类路径映射
多语言页脚需配合I18nFilter和T函数
如果页脚含“关于我们”“联系方式”等文字,不能硬编码,得走Revel的i18n机制。前提是app/messages/下已有对应语言文件(如footer.en),且I18nFilter已在app/init.go中启用。
- 在
_footer.html中写{{T "footer.about"}} {{T "footer.contact"}} - 确保
footer.en里有footer.about=About Us这样的键值对 - 修改消息文件后,开发模式下热重载生效;生产环境需重启应用
- 若
T函数返回空字符串,先检查messages/目录是否存在、文件名后缀是否为en而非en-US
页脚里动态插入当前年份要小心作用域覆盖
常见做法是在页脚写© {{.CurrentYear}} {{.SiteName}},但.CurrentYear通常不在每个控制器的渲染参数里,硬塞容易漏传。更稳妥的是用Revel内置的set函数在布局层统一注入。
- 在
layouts/main.html顶部加{{set ."CurrentYear" (printf "%d" (now.Year))}} - 这样所有子模板(包括
_footer.html)都能读到.CurrentYear - 避免在
_footer.html里调用now函数——它依赖revel.TemplateFuncs注册,且每次调用都新建time.Time实例,没必要 - 注意
set只在当前模板及template调用链中有效,不会污染控制器原始数据
ParseFiles加载导致template not defined、静态资源路径写错导致404、多语言键名拼错或i18n filter位置不对导致翻译不生效。这三类错误都不会在编译时报出来,全靠运行时观察输出。


















