Buffalo命名路由函数(如UsersPath、UsersURL)由框架自动生成于routes/routes.go,需传map[string]string匹配路由参数,模板中用安全跳转,重定向应调c.Redirect(302, UsersPath())而非硬编码路径。

Buffalo 的命名路由(named routes)不能靠字符串硬编码拼接 URL,必须用框架生成的函数调用,否则改路径时模板和重定向全失效。
命名路由函数怎么生成和使用
Buffalo 在 app.go 初始化时自动生成一组全局函数,如 UsersPath()、UsersNewPath()、UsersResourcePath({“id”: “123”}),它们位于 routes/routes.go 生成的代码中(由 buffalo dev 或 buffalo build 触发更新)。
- 函数名规则:资源名首字母大写 +
Path或URL后缀;URL版本返回完整地址(含协议和 host),Path版本只返回路径段(如/users/123) - 带参数的路由必须传 map[string]string,键名要和路由定义中命名参数完全一致,比如
app.GET("/posts/{slug}", PostsShow)→ 调用PostsPath({"slug": "hello-world"}) - 若传错 key(如
{"id": "123"}但路由是{slug}),运行时 panic 报missing route parameter: slug - 不要手动 import 这些函数——它们是代码生成的,放在
routes包下,模板里直接可用
Plush 模板里怎么安全跳转
在 .plush.html 模板中,优先用 替代 /users 字符串;它会自动做 HTML 属性转义,且支持嵌套调用(如 href="")。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 别在
href或action里拼接 query string,比如UsersPath() + "?q=test"—— 正确做法是用UsersPath({"q": "test"}),框架会自动 encode - 如果需要带 fragment(#section),只能手动拼:
#top,因为命名函数不处理 fragment - 表单
<form action="<%=%20UsersPath()%20%>"></form>是安全的;但 POST 表单若需 CSRF token,得额外加<input name="_csrf" value="<%= csrf_token() %>">,命名函数不自动注入 - JS 中要用命名路由?不行。Plush 不渲染 JS 内容,
UsersPath()在 JS 字符串里只是字面量。应把路径提前注入 data 属性:<div data-users-path="<%= UsersPath() %>">,再由 JS 读取 <h3>重定向时为什么 <code>c.Redirect()接函数更稳Handler 中重定向,必须用
c.Redirect(302, UsersPath()),而不是c.Redirect(302, "/users")。后者一旦路由变更,就变成 404,且编译器无法发现。-
c.Redirect()第二个参数类型是string,所以可直接传函数返回值;它不校验路径是否存在,只做 HTTP 3xx 跳转 - 若重定向目标需要动态参数,确保 struct 字段已序列化为 string:比如
User{ID: 123}→UsersResourcePath({"id": fmt.Sprintf("%d", u.ID)}),别传u.ID整数,会 panic - 命名函数调用失败时(如参数缺失)会在响应阶段 panic,不是编译期报错,所以单元测试里一定要覆盖所有重定向分支
- API 场景下不用命名路由跳转,但
c.JSON()响应体里仍可嵌入UsersURL()返回绝对地址供前端跳转
命名路由函数看似省事,但依赖代码生成流程;删了
routes/routes.go或忘了跑buffalo dev,模板里调用就会报 undefined function —— 这个错误不会出现在 IDE 提示里,只在页面渲染时炸开。 -


















