Buffalo 的 buffalo generate resource 命令不生成独立路由文件,而是向 app.go 插入 app.Resource("/users", UsersResource{}),并生成 actions/users.go(含 List/Show/Create/Update/Destroy 方法)、模型、迁移及模板;路由映射由框架内部约定自动完成。

buffalo generate resource 会生成哪些路由文件
Buffalo 的 buffalo generate resource 命令不会直接生成独立的“路由代码文件”,而是把路由注册逻辑写进 app.go,同时生成配套的 handler、action、template 和模型文件。你看到的路由定义实际是调用 app.Resource() 或 app.GET()/app.POST() 等方法完成的,不是声明式 DSL。
常见误解是期待生成类似 Rails 的 routes.rb,但 Buffalo 把路由和应用初始化耦合在 app.go 的 app.New() 函数里。
- 执行
buffalo generate resource users后,app.go中会插入一行app.Resource("/users", UsersResource{}) - 对应
UsersResource{}结构体定义在actions/users.go,它实现了Find, List, Create, Update, Destroy等方法 - 所有 HTTP 方法映射(GET /users → List, POST /users → Create 等)由
buffalo.Resource内部约定,不显式写出每条app.GET
想手动添加 REST 路由时该调用哪个函数
绕过 Resource、精确控制每条路由,要用 app.GET、app.POST 等基础方法,在 app.go 的 app.New() 函数内添加。它们返回 *App,支持链式调用。
注意:这些函数必须在 app.Use(...) 中间件注册之后、app.ServeFiles(...) 之前调用,否则可能被中间件拦截或静态文件路由覆盖。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
-
app.GET("/api/v1/users", UsersList)—— 显式绑定 handler 函数 -
app.POST("/api/v1/users", UsersCreate)—— 注意 handler 必须是func(c buffalo.Context) error类型 - 带参数的路由:
app.GET("/users/{id}", UserShow),参数通过c.Param("id")获取 - 不要在 handler 名字后加括号:
UsersList✅,UsersList()❌(那是调用,不是传参)
生成的路由不生效?检查这三个地方
Buffalo 路由失效通常不是命令问题,而是环境或配置偏差。最常踩的坑集中在以下三处:
- 没重新运行
buffalo dev:生成命令只是写文件,不自动重启服务;保存app.go后 dev 模式会热重载,但首次生成后必须确保进程已拉起 - 路由路径冲突:比如先写了
app.GET("/{slug}", HomeHandler),再加app.GET("/admin", AdminHandler),因为/{slug}是通配前缀,/admin永远匹配不到 —— 把更具体的路由放在前面 - 中间件提前终止:自定义中间件里忘了
return c.Next(),或者用了c.Error()/c.Redirect()却没 return,导致后续路由不执行
如何查看当前所有已注册的路由
Buffalo 不提供内置的 rails routes 等价命令,但可以通过启动时日志或代码调试快速确认。开发阶段最可靠的方式是加一行打印:
app := buffalo.New(buffalo.Options{
Env: ENV,
SessionName: "_myapp_session",
})
// 在 app.Use() 之后、app.ServeFiles() 之前插入:
fmt.Printf("Registered routes:\n%+v\n", app.Routes().Routes)
输出是 []*buffalo.Route 切片,包含每个路由的 Method、Path、HandlerName、Middleware 等字段。注意:这个结构在生产模式下可能被裁剪,仅限开发期调试用。
真正上线前别留这行 —— 它会暴露 handler 名称和内部路径结构,属于信息泄露风险点。


















