Revel 模板中必须用 @url() 生成 URL,不可拼接字符串;其参数需严格匹配 conf/routes 中的控制器动作全名、占位符键名及大小写,多参数顺序无关但键名必须一致,嵌套路由或动态前缀需在控制器中预计算。

模板里用 @url() 生成 URL,不是拼字符串
Revel 没有独立的 reverse() 函数,反向路由能力直接 baked 进模板引擎。你必须靠 @url() 模板函数,传控制器动作全名和参数,由框架自动查 conf/routes 生成合法路径——手拼 /hotels/123 看似快,但一旦路由改了(比如加斜杠、换参数名),所有地方都得手动同步,极易出错。
常见错误现象:页面渲染出 /hotels/:id 或空链接,或跳转 404;原因基本是路由没命名、参数名不匹配、或 conf/routes 里漏写了动作名。
-
@url()第一个参数必须是Controller.Action全名,大小写敏感,且该行必须在conf/routes中存在(例如GET /hotels/:id Hotels.Show) - 参数键名必须与路由中占位符完全一致:
:id→ 键写"id",:uid→ 键写"uid",不能写成"ID"或"Id" - 参数值会被自动转为字符串,传
123和"123"效果一样;但若值含斜线(如"123/abc"),@url()不报错,只生成非法 URL,后端必然 404
尾部斜杠行为由 conf/routes 决定,不是模板控制
URL 是否带尾部斜杠,完全取决于你在 conf/routes 里怎么写的路径模式。模板里的 @url() 只是忠实还原它。
例如:
-
GET /hotels/ Hotels.Index→@url("Hotels.Index")生成/hotels/ -
GET /hotels Hotels.Index→@url("Hotels.Index")生成/hotels
别指望在模板里加逻辑判断斜杠;也别在路由里写 /hotels/? 之类模糊语法——Revel 不支持正则路径,只认字面匹配。
多参数顺序无关,但键名必须对得上占位符
Revel 的 @url() 是按 key-value 匹配,不是按位置。只要键名和路由定义中的占位符一致,顺序可以乱。
比如路由是 GET /users/{uid}/posts/{slug} Posts.Show,下面两种写法等效:
@url("Posts.Show", "slug", "welcome", "uid", 999)
@url("Posts.Show", "uid", 999, "slug", "welcome")
但注意:如果路由用了花括号正则(如 {uid}),而你传了非数字的 "uid" 值,@url() 仍会生成 URL,只是后端匹配失败返回 404——它不校验值是否符合正则,只管拼。
嵌套路由或动态前缀?模板里做不到,得靠控制器预计算
@url() 只能生成静态定义的路由,无法处理运行时才确定的路径结构。比如你想根据用户角色生成不同前缀的 URL(/admin/users vs /api/v2/users),或者要给所有链接自动加 ?t=123 时间戳,@url() 无能为力。
这时必须把 URL 构建逻辑提到控制器里:
- 在
Controller方法中调用c.URL("Users.List", "page", 2)得到字符串 - 用
c.RenderArgs["listURL"] = urlStr传给模板 - 模板里直接写
@#@#@#@#@#@#@#@#@#@0
这是唯一可靠方式。试图在模板里用 if 判断角色再套多个 @url(),只会让逻辑散落、难以测试、路由变更时漏改。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











