2009-08-30 8 views
8

Molti dei metodi controller disponibile (catena, avanti, reindirizzamento) prendere una mappa che può includere tasti quali:Grails metodi controllore

  • id
  • params
  • modello

Un paio di domande su questi:

  • E 'id' solo un n alias per un parametro di richiesta denominato 'id'? In altre parole, v'è alcuna differenza tra:

chain(controller: "member", action: "showProfile", params: [id: memberId])

e

chain(controller: "member", action: "showProfile", id: memberId)

  • Il chain metodo (possibilmente tra gli altri) consente il passaggio in un modello e/o params (mappa) dall'azione del controller da A a B. In pratica, qual è la differenza tra il passaggio dei dati dall'azione A alla B tramite i parametri e le mappe del modello? Inoltre, se i dati vengono passati nella mappa del modello, come posso accedervi nell'azione del controller B?

risposta

7

"id" viene da voci UrlMappings come "/ $ controller/$ azione?/$ Id?" - vedi http://docs.grails.org/latest/guide/single.html#urlmappings per l'uso.

I param sono parametri di querystring o parametri di post forma, accessibili nelle app non Grails utilizzando "request.getParameter ('foo')" ma semplificati in Grails come "params.foo". I contenuti della mappa del modello sono memorizzati nella richiesta come attributi, accessibili nelle app non Grails utilizzando "request.getAttribute ('foo')" ma semplificati in Grails come "request.foo" o più tipicamente accessibili direttamente in GSP, ad es. "$ {Pippo}".

+1

Ho dato un'occhiata ai documenti e sembra che l'ID sia in realtà un parametro di richiesta, ad es.dovresti accedervi in ​​un controller usando 'params.id'. È coerente con la tua comprensione? –

9

Tutto ciò che Burt ha detto è corretto. Inoltre, il motivo per cui si desidera eseguire una catena (se si dispone di un modello) o un reindirizzamento (se non si dispone di un modello da conservare) è perché entrambi i metodi restituiscono una risposta di reindirizzamento 302 al browser . Il browser quindi sa di chiedere la prossima pagina.

Ha quindi l'url corretto nell'intestazione per la pagina risultante, piuttosto che l'url dalla pagina da cui proviene la richiesta originale.

Questo schema è molto utile dopo un POST di informazioni in quanto evita tutti i tipi di problemi con il segnalibro e la reinvio delle informazioni se l'utente raggiunge l'aggiornamento sulla pagina risultante.

Es: se si sta salvando un libro e si desidera eseguire il rendering della pagina di elenco se il libro è stato salvato correttamente. Se chiami semplicemente "controller.list()" nel tuo metodo, mostrerà all'utente l'elenco di libri che viene visualizzato, ma la barra dell'URL continuerà a pronunciare ".../book/save". Questo non va bene per il bookmarking o il ricaricamento. Invece, chiamare reindirizzamenti/catena invierà la risposta 302 al browser dicendogli di chiedere la pagina ".../book/list", cosa che fa. Tutte le variabili (il modello e altri messaggi flash) sono in ambito flash, quindi sono ancora disponibili per il modello/vista da utilizzare e tutto è felice nel mondo.

Questo schema è denominato Post/Redirect/Get.

Problemi correlati