Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Grails REST CRUD控制器方法_Grails_Grails Controller - Fatal编程技术网

Grails REST CRUD控制器方法

Grails REST CRUD控制器方法,grails,grails-controller,Grails,Grails Controller,我是Grails的新手,尽管我有很多使用其他不同语言(Perl、Python、Ruby)的mvc框架开发Web应用程序的经验 我试图理解grails中CRUD的含义 基本上,Grails默认为create函数创建以下两种方法: create,用于显示要创建的表单 保存,用于保存已发布的表单 现在来自不同的框架,我习惯于只有一种创建方法: create,如果请求方法是GET,则此函数将显示表单;如果请求方法是POST,则此函数将保存表单,这似乎是大多数框架的首选方式 为什么Grails会采用完全不

我是Grails的新手,尽管我有很多使用其他不同语言(Perl、Python、Ruby)的mvc框架开发Web应用程序的经验

我试图理解grails中CRUD的含义

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

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

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

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

为什么Grails会采用完全不同的方法来实现这一功能?我知道我可以手工改变它,但是这样做会有什么影响呢?我将失去什么,我将获得什么

我知道这不是一个非常具体的问题,我当然不想发动一场火焰战,但我想知道为什么要选择另一种方式


提前感谢您的回答。

generate controller
generate all
生成的代码只是一种方便和建议。但它会生成到您的应用程序中,所以根据需要编辑它,或者如果您愿意,从头开始编写所有内容

另一种方法是
create
操作,该操作接受GET请求并仅创建一个新实例,并呈现GSP以创建实例,另外还有
save
操作,该操作仅接受POST请求,并在实例为一个
create
方法时执行实际创建,该方法同时执行以下两项操作:

def create() {
   if (request.post) {
      // persist the new instance
   }
   else {
      // render the GSP
   }
}
这需要明确的逻辑来确定要做什么,这会使代码变得混乱。Grails采用的方法更为简洁,因为每个操作都更加集中,并且只做一件事。这样做的另一个好处是使测试更容易


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

当您生成控制器时,它会使用一些默认模板来执行{index,list,create,save,show,edit,update,delete}操作。这仅仅是一个起点,或仅供参考

我通常为面向公众的应用程序设置URL映射,以处理基于HTTP方法的路由。有关详细信息,请参阅

基本上,这可以让您执行以下操作:

static mappings = {
   "/product/$id"(controller:"product") {
       action = [GET:"show", PUT:"update", DELETE:"delete", POST:"save"]
   }
}

在控制器中,动作应该是分开的,因为它们有不同的用途。Grails允许您设置URL映射来处理HTTP方法路由。

是的,我确实理解这一点,但问题是,如果我这样做,除了代码变得有点凌乱之外,还有什么问题需要解决,这也是可以解决的。特别是考虑使用javascript库,比如backbone.js或ExtJS,它们似乎使用get/post方法。。。使用单独的创建/保存方法的缺点还在于,您必须以某种方式禁止对保存操作执行GET请求……禁止对
save
操作执行GET请求是一种安全预防措施。有些情况下,允许通过GET进行删除的应用程序被搜索引擎抓取,数据丢失。不仅如此,在现代浏览器中,通过预取url,您会发现一些奇怪的行为……这是一个好主意,但您如何区分这两种显示,它将显示所请求的对象并显示该对象的可编辑版本,这意味着一个包含所有可编辑字段的表单?正如您所指出的Grails,生成两个不同的控制器操作,一个用于显示资源“show”,另一个用于显示该资源“edit”的编辑表单,这两个操作都使用HTTP GET方法。没有任何东西阻止您在show视图中组合这两个操作。它记录在何处?我指的是
[method:“action”]
部分文档已经更新-您可以在这里找到Grails2.4.4到HTTP方法的映射