2009-08-30 13 views
8

Muchos de los métodos de controlador disponibles (cadena, hacia adelante, redirigir) tomar un mapa que puede incluir teclas tales como:Grails métodos controlador

  • Identificación del
  • params modelo

Un par de preguntas sobre esto:

  • Es 'id' solo una n alias para un parámetro de solicitud llamado 'id'? En otras palabras, hay alguna diferencia entre:

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

y

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

  • El chain método (posiblemente entre otros) permite pasar de un modelo y/o params (mapa) de la acción del controlador A a B. Prácticamente hablando, ¿cuál es la diferencia entre pasar datos de la acción A a B a través de los parámetros y mapas modelo? Además, si los datos se pasan en el mapa modelo, ¿cómo puedo acceder a él en la acción B del controlador?

Respuesta

7

'id' viene de las entradas de UrlMappings como "/ $ controller/$ action?/$ Id?" - ver http://docs.grails.org/latest/guide/single.html#urlmappings para el uso.

Los parámetros son parámetros querystring o forman parámetros posteriores, a los que se accede desde aplicaciones que no son de Grails utilizando "request.getParameter ('foo')", pero simplificados en Grails como "params.foo". Los contenidos del mapa modelo se almacenan en la Solicitud como atributos, se accede a ellos en aplicaciones que no son de Grails utilizando "request.getAttribute ('foo')", pero se simplificó en Grails como "request.foo" o más se accede directamente en GSP, p. "$ {foo}".

+1

Eché un vistazo a los documentos y parece que id es de hecho un parámetro de solicitud, es decirlo accederías en un controlador usando 'params.id'. ¿Eso es consistente con tu comprensión? –

9

Todo lo que Burt dijo es correcto. Además, la razón por la que desearía hacer una cadena (si tiene un modelo) o una redirección (si no tiene un modelo que conservar) es porque ambos métodos devuelven una respuesta de redireccionamiento 302 al navegador . El navegador entonces sabe para pedir la página siguiente.

Luego tiene la url correcta en el encabezado de la página resultante, en lugar de la url de la página donde estaba la solicitud original.

Este patrón es muy útil después de una POST de información, ya que evita todo tipo de problemas con los marcadores y vuelve a enviar la información si el usuario accede a la página resultante.

Ej .: si está guardando un Libro y desea mostrar la página de la lista si el libro se guardó correctamente. Si solo llama a "controller.list()" en su método, le mostrará al usuario la lista de libros que se procesa, pero la barra de direcciones seguirá diciendo ".../reservar/guardar". Esto no es bueno para marcar o recargar. En cambio, al llamar a redirect/chain enviará la respuesta 302 al navegador indicándole que solicite la página ".../book/list", lo que hace. Todas sus variables (su modelo y otros mensajes flash) están en el alcance del flash, por lo que todavía están disponibles para su modelo/vista y todo está contento en el mundo.

Este patrón se llama Post/Redirect/Get.

Cuestiones relacionadas