Revel 的 revel gen -t crud 生成器仅产出 CRUD 骨架代码,需提前手动完成三件事:定义含有效 db tag 的 app/models/user.go、创建对应数据库表、在 conf/routes 中配置 GET /user/list User.List 路由;否则生成代码无法运行。

Revel 的 revel gen 生成器不是“一键部署后台”的魔法工具,它只负责按约定产出 CRUD 骨架代码;真正能跑起来的前提是:模型已定义、数据库表已存在、conf/routes 已配置、app/models/ 和 app/controllers/ 路径正确——漏掉任一环,生成的代码就只是死文件。
生成前必须手动准备的三件事
生成器不建表、不写模型、不配路由,它只读取已有结构。常见错误是运行 revel gen -t crud -m User 后访问 /user/list 直接 500 或空白页,根源几乎都在这三步没做:
-
app/models/user.go必须存在,且含有效 struct(字段名首字母大写,带db:tag) - 对应数据库表(如
users)必须已创建,字段名、类型需与 model 严格一致 -
conf/routes中需有至少一行GET /user/list User.List,否则路由不生效
revel gen -t crud 生成的文件在哪、怎么用
命令执行后,它会在固定位置写入文件,不会询问路径,也不会覆盖已有文件(除非加 -f):
- 控制器:
app/controllers/user.go(注意小写user,不是User) - 模板:
app/views/User/目录下生成List.html、Edit.html等,路径名大写(因控制器名是User结构体) - 方法签名里带
id int参数的(如View),会自动从 URL 路径提取并转为整型,无需手动c.Params.Int - 生成的
Save方法默认用c.Params.Bind绑定表单,字段名必须与 HTMLname属性完全一致(区分大小写)
生成后必改的两个硬伤
生成器产出的是“能编译”的代码,不是“能上线”的代码。以下两处不手动改,必然出问题:
- 模板中所有
/public/xxx引用要改成/assets/xxx,比如<link href="/public/css/app.css">→<link href="/assets/css/app.css">,否则静态资源 404 -
User.List方法里默认调用User.All(),但生成器不帮你实现这个方法——你得在app/models/user.go里补上func (u *User) All() ([]*User, error),用revel.DB.Select或 Gorp 查询
为什么改了 public/ 下的 JS 却不生效
开发时热重载只监听 app/ 和 conf/ 目录,app/public/ 下的修改不会触发重启,浏览器缓存又常导致旧 JS 继续执行。这不是生成器的问题,而是 Revel 的设计约束:
- 静态文件路径固定映射到
/assets/,不能通过配置改成/public/ - 改完
app/public/js/main.js后,必须手动刷新浏览器,不能依赖热重载 - 如果用了富文本编辑器等前端库,其初始化代码要放在
$(document).ready或DOMContentLoaded里,避免 DOM 尚未渲染就执行
生成器省的是手敲 10 个 if err != nil 和表格 HTML 的时间,不是省掉理解 Revel 路由规则、模板路径约定和静态资源映射逻辑的时间。最常卡住的地方,永远是 app/views/User/List.html 找不到,或 /assets/js/app.js 返回 404——这两处错一个,整个页面就白屏。


















