2009-09-23 11 views
10

En mi controlador de Grails Estoy respondiendo a una llamada AJAX y el uso de render devolver el texto:griales "render" renders la plantilla

def ajaxRandomPersonName = { 
    def person = get a random person ... 
    render "Name: ${person.name}" 
} 

El problema es que render renders toda la plantilla. Entonces, en lugar de simplemente representar "Nombre: John", representa todos los iconos, navegación, etc. definidos en la plantilla. ¿Cómo obtengo render para procesar sin la plantilla?

Estoy siguiendo el Capítulo 1 de "Grails en acción" (página 28) usando Grails 1.1.1.

Seguimiento: Devolver el valor falso por sugerencia de Rhysyngsun no tiene ningún impacto. También intentado fijar la plantilla en nulo pero todavía hace que la plantilla:

def ajaxRandomPersonName = { 
    def person = get a random person ... 
    render (template:null, text:"Name: ${person.name}") 
} 

render tiene su doblado corazón en que lo hacen a través de la plantilla, no importa lo que hago.

Seguimiento 2: Parallel discussion en la lista de correo de Grails-usuario.

Seguimiento 3: Código de ejemplo: He vinculado mi código al mínimo y todavía muestra la representación de la plantilla no deseada.

controladores/PersonController.groovy:

class PersonController { 
    def index = { } 
    def home = { [message:"Hello"] } 

    def ajaxTest = { 
     println "ajaxTest called" 
     render text: "ajax message" 
    } 
} 

vistas/persona/home.gsp (ver página para el método de la casa)

<html> 
<head> 
    <title>Home View</title> 
    <g:javascript library="prototype" /> 
</head> 
<body> 
    <p> 
     <g:remoteLink action="ajaxTest" update="test1">ajax call</g:remoteLink> 
    </p> 
    <p>Message = ${message}</p> 
    <p id="test1">Blank</p> 
</body> 
</html> 

views/layouts/person.gsp (plantilla de diseño para la persona controlador)

<html> 
<head> 
    <title>Test App - <g:layoutTitle/></title> 
    <g:layoutHead/> 
</head> 
<body> 
    <h1>Test App</h1> 
    <g:layoutBody/> 
</body> 
</html> 

accedo controlador persona con la vista de inicio: http://localhost:8080/test/person/home

la página se representa como: Test App llamada AJAX (hipervínculo) Mensaje = Hola blanco

"Test App" es de la plantilla. Cuando hago clic en "ajax call", realiza una llamada asincrónica al método ajaxTest de PersonController (verificado con println). Todo lo que hace ajaxTest es println y renderiza texto estático. Esta resultante en la siguiente:

Test App 
ajax call 
Message = Hello 
Test App 
ajax message 

Observe que la plantilla está siendo emitida dentro de "test1" <p> que resulta en la segunda "App Test".

Estoy ejecutando Grails 1.1.1. ¿Algunas ideas? El código parece sencillo. Descargué la fuente de Grails y miré RenderDynamicMethod.java. No hace ninguna representación de plantilla a menos que la plantilla esté en la lista de argumentos, que no es así. Así que mi única conjetura es que algo se está convirtiendo en la plantilla de nuevo.

Respuesta

13

se resuelve: Adición contentType resulta en la plantilla no se queden:

render text: "Name: ${person.name}", contentType: "text/plain" 
+1

¿cómo supiste esto? –

+4

Sí, explique dónde encontró esta respuesta. En una nota al margen, es una pena que el capítulo 1, que debería haberme tomado 30 minutos, me haya tomado horas completarlo. Y, estoy completamente decepcionado por mi primera puñalada en Grails –

0

Hemos encontrado que devolver explícitamente falso de la acción corrige esto.

Creo que hacer render foo ya que JSON devuelve false implícitamente.

+0

Intenté devolver falso después del renderizado y sigue representando la plantilla. –

3

Haga su lado del cliente código javascript manejar un responden JSON y hacen su respuesta con:

rendir [Texto: "Nombre: $ {} person.name"] como JSON

2

Usted puede ser quemarse por la característica de 'diseño por convención' en Grails. Si el nombre de su diseño coincide con el prefijo del nombre del controlador, por ejemplo, Grails aplicará el diseño a cada vista administrada por ese controlador. Lamentablemente, incluso se aplica a texto y plantillas. Actualmente hay algunas JIRA registradas con respecto a esto (ver http://jira.grails.org/browse/GRAILS-7624 por ejemplo). Me quemé por esto hoy. Lo resolví simplemente cambiando el nombre de mi diseño gsp de modo que no coincida con ningún nombre de controlador. Mi diseño inicialmente se llamaba 'storefront.gsp' y tengo un controlador llamado StorefrontController. Cambié el nombre del diseño a 'public.gsp'.