Grails是否支持Restful嵌套URL?

syl*_*psa 5 grails

Grails是否支持Restful嵌套URL,例如'/ articles/1/comments/5'?如果没有,那有什么插件吗?

Rob*_*vey 6

看到这里.Grails 2.3将支持嵌套的RESTful URL.


iku*_*men 5

如果您使用较旧的Grails版本(例如<2.3),并且可用的插件无效,则可以使用命名的URL映射来生成有效的restful映射.

这是我的一个项目的一个例子 - 我遗漏了一些细节,但希望如果你决定尝试这种方法,这会让你开始.

在你的UrlMappings.groovy中

/** 1. Mappings can handle multiple actions depending on HTTP 
    method like Rest. Names are a little clunky, like this would
    be more appropriate as "resource" vs "showResource" but we didn't want
    potential naming conflict in future release 

    2. TODO: DRY constraints - make constraints global  
    3. make sure controllers have proper actions defined
*/

/** RESTFUL mapping for single resource */
name listResources: "/$controller" { 
  action = [GET: "list", POST: "save"] 
}
name createResource: "/$controller/create" { 
  action = [GET: "create" ] 
}
name deleteResource: "/$controller/$id?/delete" { 
  action = [POST: "delete", DELETE: "delete"] 
  constraints { id(matches: /[0-9]+/) }
}
name editResource: "/$controller/$id?/edit" { 
  action = [GET: "edit", PUT: "update", POST: "update"] 
  constraints { id(matches: /[0-9]+/) }
}
name showResource: "/$controller/$id?" { 
  action = [GET: "show", PUT: "update", POST: "update", DELETE: "delete"]
  constraints { id(matches: /[0-9]+/) }
}

/** RESTFUL mapping for CHILD with PARENT */
name listChildResources: "/$parentResource/$pid/$controller" { 
  action = [GET: "list", POST: "save"]
  constraints { pid(matches: /[0-9]+/) }
}
name createChildResource: "/$parentResource/$pid/$controller/create" {
  action = [GET: "create" ] 
  constraints { pid(matches: /[0-9]+/) }
}
name showChildResource: "/$parentResource/$pid/$controller/$id?" { 
  action = [GET: "show", PUT: "update", POST: "update", DELETE: "delete"] 
  constraints { 
    id(matches: /[0-9]+/)
    pid(matches: /[0-9]+/) 
  }
}
name editChildResource: "/$parentResource/$pid/$controller/$id?/edit" { 
  action = [GET: "edit"]
  constraints { 
    id(matches: /[0-9]+/)
    pid(matches: /[0-9]+/) 
  }
}
Run Code Online (Sandbox Code Playgroud)

确保控制器具有操作和支持的HTTP方法定义,例如

static allowedMethods = [
  save: "POST", 
  update: ["POST", "PUT"], 
  delete: ["POST", "DELETE"]
]
Run Code Online (Sandbox Code Playgroud)

然后使用这样的映射(例如,假设我们将花园和植物作为资源).

//show a garden
<g:link mapping="showResource" controller="garden" 
   id="${gardenInstance.id}">${gardenInstance.name}</g:link>

//create a plant for garden
<g:link mapping="createChildResource" controller="plant" 
   params="[parentResource: 'garden', pid: gardenInstance.id]">Add Plant</g:link>

//show list of plants within a garden
<g:link mapping="listChildResources" controller="plant" 
   params="[parentResource: 'garden', pid: gardenInstance.id]">List plants for Garden</g:link>
Run Code Online (Sandbox Code Playgroud)

这里显示它非常冗长,但你可以把所有这些都放到TagLib中并且有类似的东西.

<g:restShow resource="garden" 
   id="${gardenInstance.id}">${gardenInstance.name}</g:restShow>

<g:restCreate" resource="plant" 
   parent="${gardenInstance}">Add Plant</g:restCreate>
Run Code Online (Sandbox Code Playgroud)