Buffalo 不支持自动更新资源,所有修改必须手动完成:生成迁移并执行、同步更新 model 字段及 db tag、在 actions 文件指定区域添加 handler、模板与路由需同时调整,且 migration 与 model 的 db tag 必须严格一致。

Buffalo 没有 buffalo update resource 或类似“更新已有资源”的命令——所有资源(models、actions、templates、migrations)一旦生成,就必须手动维护。所谓“更新”,本质是增量修改 + 手动同步,不是一键覆盖。
为什么不能直接重跑 buffalo generate resource
重复执行该命令不会合并或覆盖,而是报错退出:file exists。它只在空目录下创建文件,不识别已存在结构;强行加 -f 或删文件再跑,会导致:
- 原有业务逻辑(如自定义验证、关联查询、中间件调用)被清空
- 模板中手写的 Plush 表达式(
<%= f.InputTag("name") %>)丢失 - 路由注册可能重复(
app.Resource("/users", usersResource)被多次调用 panic) - migration 文件名带时间戳,重复生成会冲突,
soda migrate up报错
给 model 加字段:必须走 migration,不能只改 models/user.go
只改结构体字段会立刻导致运行时失败——pop 不会自动映射未声明的字段,也不会报错,只会静默忽略或写入 NULL。
Buffalo框架 1.0.1 版本源码包下载,适合需要错误处理改进、依赖更新、render.Download 注释和 request logger 调整的 v1 项目。
- 先生成迁移:
buffalo generate migration add_age_to_users age:int - 编辑生成的
migrations/xxx_add_age_to_users.up.fizz,确认 SQL 正确(如add_column("users", "age", "integer")) - 执行:
buffalo db migrate(不是buffalo migrate) - 再手动更新
models/user.go:补上字段和db:"age"tag,否则Find返回空值
给 action 增加新 handler:别碰 actions/users.go 的自动生成部分
文件里有明确注释:// DO NOT DELETE: This is the generated code for the resource actions.。这部分是 scaffold 的骨架,后续修改应放在下方空白区或新建文件。
- 新增一个
Exporthandler?在actions/users.go底部另起函数,不要塞进UsersResource结构体 - 想改
Create逻辑?保留原方法签名,只改函数体内部,比如加u.SetPassword(c.Param("password")) - 需要 JSON-only 响应?删掉
c.Render,改用c.JSON(201, u),并确保Content-Type: application/json被正确设置(默认是text/html)
模板和路由变更:必须同步改两处,缺一不可
Buffalo 的路由和模板路径强绑定。比如你把 templates/users/show.html 改成 show.json.plush,但没改路由响应类型,c.Render 仍会去找 HTML 模板,报错 template: "users/show.html" is undefined。
- 改模板后,检查对应 handler 是否调用
c.Render;如果只返回 JSON,就删掉模板,改用c.JSON - 新增路由(如
GET /users/:id/export)必须显式写进config/routes.go,不能依赖 Resource 自动生成 - 删除某个 action(如
New)后,记得删掉对应路由,否则访问/users/new会 404 或触发 fallback
最易被忽略的是:migration 和 model 字段的 tag 必须完全一致,包括大小写和下划线——db:"user_name" 和数据库列 user_name 匹配,但写成 db:"username" 就查不到数据,且无任何提示。

















