2012-09-27 15 views
8

Estoy trabajando con Grails 2.1.1 y me gustaría agregar un puñado de URL personalizadas que se correlacionen con las Acciones del Controlador.Grails UrlMapping Redirección para mantener DRY

Puedo hacer eso, pero la asignación original todavía funciona.

Por ejemplo, he creado un mapeo add-property-to-directory en mi UrlMappings de la siguiente manera:

class UrlMappings { 

    static mappings = { 
     "/add-property-to-directory"(controller: "property", action: "create") 
     "/$controller/$action?/$id?"{ 
      constraints { 
       // apply constraints here 
      } 
     } 

     "/"(view:"/index") 
     "500"(view:'/error') 
    } 
} 

Ahora, puedo golpear /mysite/add-property-to-directory y ejecutaré PropertyController.create, lo que cabe esperar.

Sin embargo, todavía puedo presionar /mysite/property/create, y se ejecutará el mismo método PropertyController.create.

En el espíritu de DRY, me gustaría hacer una redirección 301 de /mysite/property/create a /mysite/add-property-to-directory.

No he podido encontrar la manera de hacerlo en UrlMappings.groovy. ¿Alguien sabe de una manera en que puedo lograr esto en Grails?

¡Muchas gracias!

ACTUALIZACIÓN

Aquí está la solución que he implementado, basado en la respuesta de Tom:

UrlMappings.groovy

class UrlMappings { 

    static mappings = { 

     "/add-property-to-directory"(controller: "property", action: "create") 
     "/property/create" { 
      controller = "redirect" 
      destination = "/add-property-to-directory" 
     } 


     "/$controller/$action?/$id?"{ 
      constraints { 
       // apply constraints here 
      } 
     } 

     "/"(view:"/index") 
     "500"(view:'/error') 
    } 
} 

RedirectController.groovy

class RedirectController { 

    def index() { 
     redirect(url: params.destination, permanent: true) 
    } 
} 
+1

No es posible a partir de ahora. Hay una solicitud de funciones para que sea posible especificar redirecciones en las asignaciones de URL: ver http://jira.grails.org/browse/GRAILS-5994 –

+0

@sudhir Gracias, eso responde mi pregunta. ¿Podría copiar su comentario en una respuesta para poder aceptarlo? –

+0

@sudhir, gracias por su comentario y el útil enlace ... Tom editó su respuesta y me llevó por el camino correcto para hacer lo que estaba buscando, así que acepté su respuesta. –

Respuesta

3

Es posible lograr esto:

"/$controller/$action?/$id?" (
    controller: 'myRedirectControlller', action: 'myRedirectAction', params:[ controller: $controller, action: $action, id: $id ] 
) 

"/user/list" (controller:'user', action:'list') 

y en la acción que consigue los valores normallny en params:

log.trace 'myRedirectController.myRedirectAction: ' + params.controller + ', ' + params.action + ', ' + params.id 
+0

Gracias por la respuesta, pero no puedo cambiar la asignación principal a un controlador de redirección porque tengo otros controladores que siguen la convención de Grails de 'controller/action/id'. Esperaba poder hacer redirecciones explícitas. –

+0

Si solo tiene una cantidad pequeña de controlador con asignación estándar, puede preparar reglas específicas adicionales. He actualizado mi comentario para incluir uno. –

+0

Gracias, Tom. Acepté tu respuesta, me condujo por el camino correcto. De hecho, terminé creando el 'RedirectController', pero en lugar de asignar'/$ controller/$ action?/$ Id? "A él, creé una entrada para' property/create', y lo haré para cada URL que no quiero que se repita. –

0

A partir de Grails 2.3, es posible hacer redirige directamente en el UrlMappings, sin la necesidad de un controlador de redirección. Así que en caso de que la actualización, puede redirigir en urlMappings como tal, según el documentation:

"/property/create"(redirect: '/add-property-to-directory') 

parámetros de la petición que formaban parte de la solicitud original se incluirá en la redirección.