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.
¿cómo supiste esto? –
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 –