【问题标题】:Grails REST CRUD Controller MethodsGrails REST CRUD 控制器方法
【发布时间】:2013-01-23 04:26:28
【问题描述】:

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

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

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

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

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

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

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

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

提前感谢您的分析。

【问题讨论】:

标签: grails grails-controller


【解决方案1】:

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

我通常为面向公众的应用程序做的是设置 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 方法路由。

【讨论】:

  • 这是一个不错的主意,但是在显示请求的对象和显示该对象的可编辑版本(即包含所有可编辑字段的表单)之间有何不同?
  • Grails 如您所述,生成 2 个不同的控制器操作,一个用于显示资源“显示”,一个用于显示该资源“编辑”的编辑表单,均使用 HTTP GET 方法。
  • 没有什么能阻止您在显示视图中将两者结合起来。
  • 记录在哪里?我的意思是[method: "action"] 部分
  • 文档已更新 - 您可以在此处找到 grails 2.4.4 grails.github.io/grails-doc/2.4.4/guide/theWebLayer.html#7.4.7 映射到 HTTP 方法
【解决方案2】:

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

create 操作的替代方案,它接受 GET 请求并仅创建一个新实例并呈现 GSP 以创建一个实例,加上一个仅接受 POST 请求并在实例为一个单一的create 方法,两者兼而有之:

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

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

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

【讨论】:

  • 是的,我确实明白这一点,但问题是,如果我这样做,除了代码有点杂乱之外,我还有什么松懈,这也可以修复。尤其是希望使用类似于 Backbone.js 或 ExtJS 之类的 javascript 库,它们似乎正在使用 get/post 方法……使用单独的方法创建/保存的缺点还在于,您必须以某种方式禁止 GET 请求进行保存操作...
  • 禁止对 save 操作的 GET 请求是一种安全预防措施。在某些情况下,允许通过 GET 删除的应用程序被搜索引擎抓取并丢失数据。
  • 不仅如此,通过在现代浏览器中预取 url,你会得到一些奇怪的行为......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2013-01-23
  • 1970-01-01
  • 2013-07-20
  • 2014-05-01
  • 2011-07-16
相关资源
最近更新 更多