2014-07-17 10 views
5

Su Grails 2.3.7, assumere le seguenti mappature url ..Grails non pattern matching url con parametro opzionale

"/foo/$number?"  (controller:'test', action:'actionOne') 
"/foo/$number?/bar" (controller:'test', action:'actionTwo') 

..e regolatore:

class TestController { 
    def actionOne(){ render "Action_ONE: ${params.number}" } 
    def actionTwo(){ render "Action_TWO: ${params.number}" } 
} 

Tutto bene ...

/foo/1  //prints 'Action_ONE: 1' 
/foo/2/bar //prints 'Action_TWO: 2' 
/foo//bar //prints 'Action_TWO: null' 
/foo//  //prints 'Action_ONE: null' 

... ma

/foo //prints 'Action_TWO: null' 
/foo/ //prints 'Action_TWO: null' 

Se number è facoltativo in /foo/$number?, perché fa /foo e /foo/ mappa per actionTwo()?

+1

Questo è replicabile in 2.4.2. Sembra un bug per me, puoi sollevare un problema JIRA qui https://jira.grails.org/browse/GRAILS. – dmahapatro

+0

I componenti opzionali dovrebbero funzionare se non si trovano alla fine dell'URI? –

+0

@IanRoberts Anche se non dichiarato esplicitamente, secondo i documenti, sì, ma questo non è il problema, '/ foo /' non dovrebbe mai mappare a 'action2()'. btw, l'ordine in cui i pattern URL elencati in 'URLMappings.groovy' sono importanti in termini di precedenza? Non ci credo, solo curioso. – raffian

risposta

0

in seguito due linee

"/foo/$number?"  (controller:'test', action:'actionOne') 
"/foo/$number?/bar" (controller:'test', action:'actionTwo') 

si è definito il numero come optional nella url, come si è utilizzato "?" . Cambia "$ numero?" a "$ numero" in

"/foo/$number?/bar" (controller:'test', action:'actionTwo') 

seconda riga e dovrebbe funzionare correttamente.

qui sono i dettagli sulla mappatura url https://grails.org/version/URL+mapping/8