2013-07-22 3 views

ответ

4

Если вы связаны с более старым выпуском Grails (например, < 2.3), а доступные плагины не работают, вы можете использовать named URL mappings для создания эффективного успокоительного отображения.

Вот пример из моего проекта - я не упомянул некоторые подробности, но, надеюсь, это поможет вам начать, если вы решите попробовать этот подход.

В вашем 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]+/) 
    } 
} 

Убедитесь, что вы контроллерах действия и поддерживаются методы HTTP определить, например,

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

Затем с помощью сопоставления, как так (например, позволяет сказать, что у нас есть сад и Растения в качестве ресурсов).

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

Показанный здесь текст довольно подробный, но вы можете поместить все это в TagLib и иметь что-то похожее.

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

<g:restCreate" resource="plant" 
    parent="${gardenInstance}">Add Plant</g:restCreate> 
+0

Это работает! Большое спасибо. – syllepsa

6

См. here. Вложенные URL-адреса RESTful будут поддерживаться в Grails 2.3.

+0

Спасибо за информацию, но, как вы сказали, это будет включено в входящий выпуск. Есть ли какой-нибудь плагин для того, что позволило бы сделать то же самое в Grails 2.2? – syllepsa

+0

Я понятия не имею. Я сомневаюсь в этом. Подробнее об этом здесь: http://stackoverflow.com/q/11657392 –

Смежные вопросы