Grails REST CRUD控制器方法
我是Grails的新手,尽管我有很多使用其他不同语言(Perl、Python、Ruby)的mvc框架开发Web应用程序的经验 我试图理解grails中CRUD的含义 基本上,Grails默认为create函数创建以下两种方法: create,用于显示要创建的表单 保存,用于保存已发布的表单 现在来自不同的框架,我习惯于只有一种创建方法: create,如果请求方法是GET,则此函数将显示表单;如果请求方法是POST,则此函数将保存表单,这似乎是大多数框架的首选方式 为什么Grails会采用完全不同的方法来实现这一功能?我知道我可以手工改变它,但是这样做会有什么影响呢?我将失去什么,我将获得什么 我知道这不是一个非常具体的问题,我当然不想发动一场火焰战,但我想知道为什么要选择另一种方式Grails REST CRUD控制器方法,grails,grails-controller,Grails,Grails Controller,我是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方法的映射