2009-09-23 17 views
10

Nel mio controller Grails sto rispondendo ad una chiamata AJAX e l'utilizzo di render di restituire il testo:Grails "render" rende il modello

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

Il problema è che render rende l'intero modello. Quindi, invece di eseguire il rendering di "Nome: John", rende tutte le icone, la navigazione, ecc definite nel modello. Come faccio a ottenere render per eseguire il rendering senza il modello?

Sto seguendo il capitolo 1 di "Grails in azione" (pagina 28) utilizzando Grails 1.1.1.

Follow-up: Il ritorno false per suggerimento di Rhysyngsun non ha alcun impatto. Ho anche provato a installare il modello a null, ma rende comunque il modello:

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

render ha la sua vocazione cuore su rendendolo attraverso il modello, non importa quello che faccio.

Follow-up 2: Parallel discussion sulla mailing list grails-user.

Follow up 3: Codice di esempio: Ho abbinato giù il mio codice il minimo indispensabile e presenta ancora il rendering modello indesiderato.

controller/PersonController.groovy:

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

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

views/persona/home.gsp (pagina di visualizzazione per il metodo di 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/layout/person.gsp (modello di layout a persona Controller)

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

accedo persona controller con la vista di casa: http://localhost:8080/test/person/home

pagina rende come: Test App chiamata AJAX (collegamento ipertestuale) Messaggio = Ciao Blank

"Test App" è dal modello. Quando clicco su "ajax call" effettua una chiamata asincrona al metodo ajaxTest di PersonController (verificato con println). Tutto ciò che fa ajaxTest è println e renderizza il testo statico. Ciò che ne risulta la seguente:

Test App 
ajax call 
Message = Hello 
Test App 
ajax message 

Si noti che il modello viene emessa entro "test1" <p> che si traduce nel secondo "App Test".

Sto eseguendo Grails 1.1.1. Qualche idea? Il codice sembra semplice. Ho scaricato l'origine di Grails e ho esaminato RenderDynamicMethod.java. Non esegue alcun rendering di template a meno che template non sia nella lista degli argomenti, che non lo è. Quindi la mia unica ipotesi è che qualcosa stia rendendo nuovamente il template.

risposta

13

risolto: l'aggiunta di contentType si traduce nel modello non in fase di rendering:

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

come lo sapevi? –

+4

Sì, ti preghiamo di approfondire dove hai trovato questa risposta. In una nota a margine, è un vero peccato che il capitolo 1, che dovrebbe richiedere 30 minuti, mi abbia richiesto ore per essere completato. E sono completamente deluso dalla mia prima pugnalata a Grails –

0

Abbiamo trovato che restituire esplicitamente false dall'azione risolve questo problema.

Credo di fare il rendering come JSON restituisce falso implicitamente.

+0

Ho appena provato a restituire false dopo il rendering e rende ancora il modello. –

3

Fai la tua JavaScript lato client gestire il codice di rispondere JSON e rendere la vostra risposta con:

renda [testo: "Nome: $ {} person.name"] come JSON

2

Si potrebbe bruciarsi dalla funzione 'Layout-by-convenzione' in Grails. Se il nome del layout corrisponde al prefisso del nome del controller, ad esempio, Grails applicherà il layout a ogni vista gestita da quel controller. Sfortunatamente, si applica anche a testo e modelli. Ci sono attualmente alcuni JIRA registrati per questo (vedi http://jira.grails.org/browse/GRAILS-7624 per esempio). Oggi mi sono bruciato. Ho risolto il problema semplicemente ribattezzando il mio layout gsp in modo tale che non corrisponda a nessun nome del controller. Inizialmente il mio layout era denominato 'storefront.gsp' e ho un controller chiamato StorefrontController. Ho rinominato il layout in "public.gsp".