Grails REST CRUD控制器方法

时间:2013-02-07 15:40:37

标签: grails grails-controller

我是Grails的新手,虽然我在使用不同语言的其他mvc框架(Perl,Python,Ruby)开发Web应用程序方面有很多经验。

我试图理解CRUD在grails中的含义。

基本上,Grails默认为create function创建以下两种方法:

create,用于显示要创建的表单 保存,用于保存已发布的表单

现在来自不同的框架,我习惯只有一种创建方法:

create,如果请求方法是GET,这个函数将显示表单,如果请求方法是POST,则保存表单,这似乎是大多数框架的首选方式?!?!?

为什么Grails会采用完全不同的方法来实现此功能?我知道我可以手动改变它,但这样做有什么意义呢?我将放松什么,我将获得什么。

我知道这不是一个非常具体的问题,我肯定不想开始一场火焰战,但我想明白为什么选择另一种方式......

提前感谢你的激光。

2 个答案:

答案 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-controllergenerate-all生成的代码只是一个方便和建议。它会在您的应用程序中生成,因此根据需要进行编辑,或者如果您愿意,可以从头开始编写所有内容。

接受GET请求的create操作的替代方案,只创建一个新实例并呈现GSP以创建实例,以及仅接受POST请求并执行实际创建的save操作如果实例是一个同时执行这两个操作的create方法:

def create() {
   if (request.post) {
      // persist the new instance
   }
   else {
      // render the GSP
   }
}

这需要明确的逻辑来确定要做什么,这会使代码混乱。 Grails采用的方法更清晰,因为每个操作都更集中,只做一件事。这样可以使测试更容易。

如果你发现两个动作之间最终都是共享逻辑,你可以随时将它重构为同时调用的私有方法。