3

我对 Grails 很陌生,尽管我确实有很多使用不同语言(Perl、Python、Ruby)的其他 mvc 框架开发 Web 应用程序的经验。

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

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

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

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

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

为什么 Grails 会采用完全不同的方法来实现这个功能?我知道我可以手动更改它,但是这样做会有什么影响?我会失去什么,我会得到什么。

我知道这不是一个非常具体的问题,我当然不想引发一场激烈的战争,但我想了解为什么要选择另一种方式......

提前感谢您的分析。

4

2 回答 2

8

当你生成一个控制器时,它会使用一些带有 {index, list, create, save, show, edit, update, delete} 操作的默认模板。这只是一个起点,或用作参考。

我通常为面向公众的应用程序做的是设置处理基于 HTTP 方法的路由的 URL 映射。有关详细信息,请参阅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 方法路由。

于 2013-02-07T16:25:35.510 回答
3

generate-controller和生成的代码generate-all只是为了方便和建议做什么。但是它会生成到您的应用程序中,因此请根据需要对其进行编辑,或者如果您愿意,可以从头开始编写所有内容。

create接受 GET 请求并仅创建新实例并呈现 GSP 以创建实例的操作的替代方法,加上save仅接受 POST 请求并执行实际创建的操作(如果实例是create同时执行这两种操作的单个方法):

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

这需要明确的逻辑来确定要做什么,这会使代码混乱。Grails 采用的方法更简洁,因为每个操作都更加专注并且只做一件事。这具有使测试更容易的额外好处。

如果您发现两个操作之间最终存在共享逻辑,您始终可以将其重构为两者都调用的私有方法。

于 2013-02-07T16:18:29.180 回答