我是Grails的新手,虽然我在使用不同语言的其他mvc框架(Perl,Python,Ruby)开发Web应用程序方面有很多经验。
我试图理解CRUD在grails中的含义。
基本上,Grails默认为create function创建以下两种方法:
create,用于显示要创建的表单 保存,用于保存已发布的表单
现在来自不同的框架,我习惯只有一种创建方法:
create,如果请求方法是GET,这个函数将显示表单,如果请求方法是POST,则保存表单,这似乎是大多数框架的首选方式?!?!?
为什么Grails会采用完全不同的方法来实现此功能?我知道我可以手动改变它,但这样做有什么意义呢?我将放松什么,我将获得什么。
我知道这不是一个非常具体的问题,我肯定不想开始一场火焰战,但我想明白为什么选择另一种方式......
提前感谢你的激光。
答案 0 :(得分:7)
生成控制器时,它会使用一些带有{索引,列表,创建,保存,显示,编辑,更新,删除}操作的默认模板。这只是一个起点,或用作参考。
我通常为面向公众的应用程序做的是设置URL映射,它处理基于HTTP方法的路由。有关详细信息,请参阅http://grails.org/doc/latest/guide/theWebLayer.html#mappingHTTP。
基本上,这可以让您执行以下操作:
static mappings = {
"/product/$id"(controller:"product") {
action = [GET:"show", PUT:"update", DELETE:"delete", POST:"save"]
}
}
在控制器中,操作应该是分开的,因为它们用于不同的目的。 Grails允许您设置URL映射以处理HTTP方法路由。
答案 1 :(得分:3)
generate-controller
和generate-all
生成的代码只是一个方便和建议。它会在您的应用程序中生成,因此根据需要进行编辑,或者如果您愿意,可以从头开始编写所有内容。
接受GET请求的create
操作的替代方案,只创建一个新实例并呈现GSP以创建实例,以及仅接受POST请求并执行实际创建的save
操作如果实例是一个同时执行这两个操作的create
方法:
def create() {
if (request.post) {
// persist the new instance
}
else {
// render the GSP
}
}
这需要明确的逻辑来确定要做什么,这会使代码混乱。 Grails采用的方法更清晰,因为每个操作都更集中,只做一件事。这样可以使测试更容易。
如果你发现两个动作之间最终都是共享逻辑,你可以随时将它重构为同时调用的私有方法。