Does Grails support supporting sub-URLs?

Does Grails support the same sub-URLs like "/ articles / 1 / comments / 5"? If there is no plugin for this?

+4
source share
2 answers

If you are tied to an earlier version of Grails (for example, <2.3) and the available plugins do not work, you can use named URL Mappings to create an effective soothing mapping.

Here is an example from my project - I missed some details, but I hope this helps you get started if you decide to try this approach.

In your 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]+/) } } 

Verify that the controllers have actions and that HTTP methods are supported, for example

 static allowedMethods = [ save: "POST", update: ["POST", "PUT"], delete: ["POST", "DELETE"] ] 

Then use such mappings (for example, let's say we have gardens and plants as resources).

 //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> 

The ones shown here are pretty verbose, but you can put it all in TagLib and have something like this.

 <g:restShow resource="garden" id="${gardenInstance.id}">${gardenInstance.name}</g:restShow> <g:restCreate" resource="plant" parent="${gardenInstance}">Add Plant</g:restCreate> 
+4
source

See here . RESTful sub-URLs will be supported in Grails 2.3.

+6
source

Source: https://habr.com/ru/post/1492801/


All Articles