Buffalo 中需显式注册 DELETE 路由,如 app.Delete("/users/{id}", actions.UsersDestroy),路径参数用 {id} 语法,Handler 中用 c.Param("id") 获取,注意 CORS、CSRF 配置及错误处理。

Buffalo 中如何注册 DELETE 路由
Buffalo 默认不自动为 DELETE 请求生成路由,必须显式声明。它不像某些框架(如 Rails)那样通过资源生成器隐式包含 DELETE,所以漏写就会 404。
在 app.go 或路由文件中,用 app.Delete() 显式注册:
app.Delete("/users/{id}", actions.UsersDestroy)
注意:路径参数必须用 {id} 这种花括号语法,不能写成 :id 或 $id,否则匹配失败。
- 如果用
app.Resource(),它会自动生成DELETE /resources/{id},但 handler 名固定为Destroy,不可省略 - 路径末尾不能带斜杠(
/users/{id}/),Buffalo 会拒绝匹配 - 浏览器原生表单不支持
DELETE方法,必须靠 JavaScript 发起或借助_method=DELETE+ POST 模拟(Buffalo 不内置 method-override 中间件,需手动加)
DELETE 请求的 handler 怎么取 ID 参数
Buffalo 的 Context 提供 c.Param() 获取路径参数,不是 c.Params().Get() 或 c.Request().URL.Query()。
Buffalo框架 1.0.1 版本源码包下载,适合需要错误处理改进、依赖更新、render.Download 注释和 request logger 调整的 v1 项目。
正确写法:
func UsersDestroy(c buffalo.Context) error {
id := c.Param("id") // ← 注意是 "id",和路由 {id} 里的名字一致
// 后续解析为 int 或 uuid 等类型需自行转换
return c.Render(200, r.JSON(map[string]string{"status": "deleted"}))
}
- 若路由是
/posts/{slug},就得用c.Param("slug"),名字必须完全一致 -
c.Param()返回string,没有默认零值;如果路径没匹配上,返回空字符串,不会 panic,但业务逻辑要自己判空 - 不要依赖
c.Request().URL.Path手动截取,Buffalo 的路由已解析好,重复解析易出错
前端发 DELETE 请求时容易被拦截的两个点
Buffalo 开发服务器(buffalo dev)默认不带 CORS 支持,前端跨域发 DELETE 会卡在 preflight(OPTIONS)阶段,直接报 403 或 network error。
- 必须手动加中间件,比如用
github.com/rs/cors包,且allowedMethods显式包含DELETE - CSRF 保护默认开启(尤其在非 API 模式下),
DELETE请求会被拒绝;若为纯 API 服务,建议在app.Use()前关闭:app.SkipCSRF = true - 浏览器地址栏无法触发
DELETE,只能靠 fetch / axios / form + hidden _method —— Buffalo 不像 Laravel 那样自动识别_method,得自己解析并重写c.Request().Method
DELETE 处理中 DB 删除失败怎么返回错误
Buffalo 的 pop ORM 删除操作返回 error,但直接 return err 会触发全局错误页(HTML),API 场景下应统一返回 JSON 错误。
推荐模式:
func UsersDestroy(c buffalo.Context) error {
id := c.Param("id")
user := &models.User{}
if err := models.DB.Find(user, id); err != nil {
return c.Error(404, errors.WithStack(err)) // ← 用 c.Error(),不是 panic 或 log.Fatal
}
if err := models.DB.Destroy(user); err != nil {
return c.Error(500, errors.WithStack(err))
}
return c.Render(204, r.JSON(map[string]bool{"success": true}))
}
-
c.Error()会走 Buffalo 的错误中间件,可统一格式化;而panic或裸return err会绕过它 - 成功删除建议返回
204 No Content,不是200,符合 REST 规范 - 别在 handler 里调
log.Fatal或os.Exit,会导致整个 server crash
Destroy 函数注册进路由——这三个点占了 DELETE 相关问题的八成以上。

















