2012-09-27 11 views
8

Sto lavorando con Grails 2.1.1 e desidero aggiungere una manciata di URL personalizzati che si associano a Azioni controller.Url GraillMapping Reindirizza per mantenere DRY

Posso farlo, ma la mappatura originale funziona ancora.

Per esempio, ho creato una mappatura add-property-to-directory nel mio UrlMappings come segue:

class UrlMappings { 

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

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

Ora, posso colpire /mysite/add-property-to-directory ed eseguirà PropertyController.create, come mi sarei aspettato.

Tuttavia, posso ancora premere /mysite/property/create e verrà eseguito lo stesso metodo PropertyController.create.

Nello spirito di DRY, mi piacerebbe fare un reindirizzamento 301 da /mysite/property/create a /mysite/add-property-to-directory.

Non sono riuscito a trovare un modo per farlo in UrlMappings.groovy. Qualcuno sa di come posso farlo in Grails?

Grazie mille!

UPDATE

Ecco la soluzione che ho implementato, in base alla risposta di 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

Non è possibile al momento. C'è una richiesta di funzionalità che consente di specificare reindirizzamenti nei mapping URL: consulta http://jira.grails.org/browse/GRAILS-5994 –

+0

@sudhir Grazie, questo risponde alla mia domanda. Potresti per favore copiare il tuo commento in una risposta in modo che io possa accettarlo? –

+0

@sudhir, grazie per il tuo commento e il link utile ... Tom ha modificato la sua risposta e mi ha guidato sulla strada giusta per fare ciò che cercavo, così ho accettato la sua risposta. –

risposta

3

E 'possibile raggiungere questo obiettivo:

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

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

e nell'azione si ottengono i valori normallny in params:

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

Grazie per la risposta, ma non posso cambiare la mappatura principale con un controller di reindirizzamento perché ho altri controller che seguono la convenzione di Grails di 'controller/action/id'. Speravo di essere in grado di fare reindirizzamenti espliciti. –

+0

Se si dispone di una piccola quantità di controller con mappatura standard, è possibile preparare regole specifiche aggiuntive. Ho aggiornato il mio commento per includerne uno. –

+0

Grazie, Tom. Ho accettato la tua risposta, mi ha portato sulla strada giusta. Alla fine ho creato il 'RedirectController', ma invece di mappare'/$ controller/$ action?/$ Id? ', Ho creato una voce per 'property/create' ad esso, e lo farò per ogni URL –

0

Come di Grails 2.3, è possibile fare reindirizza direttamente in UrlMappings, senza la necessità di un controller di reindirizzamento. Quindi, nel caso in cui mai l'aggiornamento, è possibile reindirizzare in urlMappings in questo modo, come da documentation:

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

parametri di richiesta che facevano parte della richiesta originale saranno incluse nel reindirizzamento.

Problemi correlati