Buffalo 模板中 if 判断需用 plush 语法:{{if .Cond}}...{{else}}{{if ...}}...{{end}}{{end}},不支持 &&、||、elif,条件表达式后不加括号,字段须导出且非 nil。

Buffalo 模板里怎么写 if 判断
Buffalo 的模板语法基于 plush,不是 Go 原生模板,也不是 HTML+JS 混写——直接套用 {{if .Cond}}...{{end}} 会报错或静默失效。
正确写法是使用 plush 的条件块语法,它更接近 Ruby 风格:
{{if .User.IsActive}}
<span>欢迎回来,{{.User.Name}}</span>
{{else}}
<span>请先激活账号</span>
{{end}}
-
{{if}}后面不加括号,条件表达式直接跟在关键字后 - 支持链式访问:
{{if .Post.Author.ID}}、{{if .Items.Length > 0}} - 注意:
.Length是plush提供的切片/数组方法,不是 Go 原生字段 - 布尔值判断要小心空字符串、nil、零值:例如
{{if .User.Email}}在 Email 为空字符串时为 false
多个条件怎么写(elif / else if)
plush 不支持 elif 关键字,也没有 else if 连写形式。必须用嵌套 {{else}}{{if ...}} 实现多路分支:
Buffalo框架 1.0.1 版本源码包下载,适合需要错误处理改进、依赖更新、render.Download 注释和 request logger 调整的 v1 项目。
{{if .Status == "draft"}}
<span class="draft">草稿</span>
{{else}}{{if .Status == "published"}}
<span class="published">已发布</span>
{{else}}{{if .Status == "archived"}}
<span class="archived">已归档</span>
{{else}}
<span class="unknown">状态未知</span>
{{end}}{{end}}{{end}}
- 每个
{{else}}后紧跟一个{{if ...}},不能换行或加空格分隔 - 嵌套层级越多,越容易漏掉
{{end}};建议用编辑器高亮或格式化工具辅助检查 - 如果条件逻辑复杂,优先考虑在 action 层预处理好状态字段(比如
.DisplayStatus),避免模板内大量判断
模板里能用哪些比较操作符
plush 支持的运算符有限,常见可用的有:==、!=、>、<、>=、<=,但不支持 &&、||、! 等逻辑运算符。
- 想表达“非空且大于 10”:不能写
{{if .Count != 0 && .Count > 10}},会解析失败 - 替代方案是拆成嵌套:
{{if .Count != 0}}{{if .Count > 10}}...{{end}}{{end}} - 或者封装到 helper 函数(如
is_valid_count),在app.go中注册后调用:{{if is_valid_count .Count}} - 字符串相等推荐用
==,不用eq(那是 Go 模板语法,plush不认)
为什么 if 判断没生效?常见坑点
最常遇到的是数据未传入模板、字段名大小写不一致、或 nil 指针解引用 panic 导致整个模板渲染中断(错误被静默吞掉,只显示空白)。
- 检查 action 中是否调用了
c.Render(...)并传入了完整结构体,比如漏了.User字段 - Go 结构体字段必须首字母大写(
IsActive),否则plush无法访问 - 对可能为 nil 的指针字段做判断前,先用
{{if .User}}守卫,再访问.User.Name - 开发时开启
DEBUG模式(buffalo dev)并在浏览器查看服务端日志,plush错误通常会打印出具体行号
真正麻烦的不是语法本身,而是模板和 Go 数据结构之间的隐式契约——字段存在性、可导出性、空值行为,都得对齐,否则判断就变成玄学。

















