Buffalo 框架硬编码集成 Plush 模板引擎,不提供入门教程;模板须用 buffalo generate 命令生成,路径/命名/结构固定;c.Render() 调用 Plush 渲染,c.HTML() 仅输出字符串;partial 需显式传参;无法替换为 html/template,因渲染逻辑深度耦合框架源码。

Buffalo 框架不提供“Plush 入门教程”这个东西——它只提供 plush 这个模板引擎的默认集成,而你用不用、怎么用、能不能换,全由框架硬编码逻辑决定。想上手,得先看清边界。
Plush 模板文件怎么生成才有效
Buffalo 不允许你手动创建空 .html 文件然后指望 c.Render() 自动识别。模板必须由框架命令生成,否则路径、命名、上下文注入全失效。
-
buffalo generate resource users name:string是唯一可靠方式:它会在templates/users/下生成index.html、show.html等全套文件,且已预置{{ yield }}、{{ partial }}和render("shared/errors.html", {errors: errors})结构 -
buffalo generate action users#new也能建templates/users/new.html,但仅限非 API 场景;加了--api就不生成任何模板 - 所有模板路径固定为
templates/,不能改目录、不能换后缀(比如/ .html .gohtml),改了就得绕过c.Render()手动执行template.ParseFiles
c.Render() 和 c.HTML() 的区别不是语义,是执行路径
c.HTML() 完全跳过 Plush,只做字符串响应;c.Render() 才真正调用 plush.Render 并注入数据。错用就等于白写模板。
Buffalo框架 1.0.1 版本源码包下载,适合需要错误处理改进、依赖更新、render.Download 注释和 request logger 调整的 v1 项目。
-
c.HTML(200, "→ 页面原样输出{{ .Name }}
"){{ .Name }},变量不会被替换 - 正确写法:
c.Render(200, r.HTML("users/show.html"), User{Name: "Alice"}),模板里才能用{{ .Name }} - 结构体字段必须首字母大写(
Name string✅,name string❌),否则 Plush 读不到;传map[string]interface{}也行,但 key 必须是 string 且拼写一致("Name"对应.Name)
partial 怎么传参?别指望自动继承
Plush 的 partial 不共享父模板的 .data,每个 partial 都要显式构造独立上下文,漏传字段就会渲染失败。
- 错误写法:
{{ partial "nav.html" }}→nav.html看不到.CurrentUser或.Flash - 正确写法:
{{ html.Partial "partials/_nav.html" (dict "User" .CurrentUser "Active" "home") }},dict是内置 helper,不能用 Go 原生 map 字面量 - 如果 partial 里还要嵌套另一个 partial(比如
_nav.html调_avatar.html),必须显式把需要的字段再传一遍:(dict "User" .User "Size" "small"),不能假设“上游有我就有”
想换 html/template?不是语法问题,是框架锁死
Buffalo 的 app.Renderer 字段私有,c.Render() 底层硬编码调用 plush.Render,连中间件拦截都不可靠。所谓“接入自定义模板引擎”,实际只有两条路:
- 放弃
c.Render():在 handler 里手动用template.ParseFiles("templates/home.html")+t.Execute(c.Response(), data),但会丢掉partial、layout、block、CSRF、Flash 等全部 Buffalo 渲染链功能 - 接受 Plush:它本就兼容
{{ .Name }}语法,只需初始化时加plush.WithDelims("{{", "}}");需要日期格式化等函数,直接plush.RegisterFunc("format_date", ...)注册即可 - 真正卡住你的从来不是 Plush 语法,而是 Buffalo 把渲染深度耦合进了整个请求生命周期——这不是配置项,是源码级硬编码










