2009-09-23 6 views
10

Dans mon contrôleur Grails je réponds à un appel AJAX et en utilisant render pour renvoyer le texte:Grails « Render » rend le modèle

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

Le problème est que le modèle render rend tout. Ainsi, au lieu de simplement rendre "Nom: Jean", il rend toutes les icônes, navigation, etc. définies dans le modèle. Comment puis-je obtenir render simplement rendre sans le modèle?

Je suis en train de suivre le chapitre 1 de "Grails in Action" (page 28) en utilisant Grails 1.1.1.

Suivi: Le retour de false par suggestion de Rhysyngsun n'a aucun impact. J'ai aussi essayé de mettre le modèle à null, mais il rend encore le modèle:

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

render a son cœur courbé sur le rendu à travers le modèle, peu importe ce que je fais.

Suivi 2: Parallel discussion sur la liste de diffusion des utilisateurs de grails.

le suivi 3: Exemple de code: J'apparié vers le bas mon code le strict minimum et il présente encore le rendu du modèle non désiré.

contrôleurs/PersonController.groovy:

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

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

vues/personne/home.gsp (page de vue pour la méthode de la maison)

<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> 

vues/layouts/person.gsp (modèle de mise en page pour personne contrôleur)

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

Je contrôleur d'accès de la personne en vue de la maison: http://localhost:8080/test/person/home

la page rend comme: Test App appel ajax (hyperlien) Message = Bonjour Blank

"Test App" est à partir du modèle. Lorsque je clique sur "appel ajax", il fait un appel asynchrone à la méthode ajaxTest de PersonController (vérifiée avec println). Tout ajaxTest fait est println et rend le texte statique. Ce qui en résulte dans les domaines suivants:

Test App 
ajax call 
Message = Hello 
Test App 
ajax message 

Notez que le modèle est rendu dans les « test1 » <p> qui se traduit par la seconde « Test App ».

Je cours Grails 1.1.1. Des idées? Le code semble simple. J'ai téléchargé la source de Grails et j'ai regardé RenderDynamicMethod.java. Il ne fait pas de rendu de gabarit sauf si template est dans la liste des arguments, ce qui n'est pas le cas. Donc, ma seule conjecture est que quelque chose en haut de la page rend le modèle à nouveau.

Répondre

13

résolu: Ajout d'contentType résultats dans le modèle pas rendu:

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

comment avez-vous su cela? –

+4

Oui, veuillez préciser où vous avez trouvé cette réponse. Sur une note de côté, c'est une honte absolue que le chapitre 1, qui aurait dû me prendre 30 minutes, m'a pris des heures pour terminer. Et, je suis complètement déçu par mon premier coup au Grails –

0

Nous avons constaté que renvoyer explicitement false de l'action corrige cela.Je crois que faire du rendu foo comme JSON retourne implicitement la fausse.

+0

Je viens d'essayer de retourner false après rendu et il rend encore le modèle. –

3

Faites votre côté client code javascript gérer une répondre JSON et de rendre votre réponse avec:

rendre [Texte: "Nom: $ {person.name}"] comme JSON

2

Vous pourriez obtenir brûlé par la fonction « mise en page par convention » dans Grails. Si le nom de votre mise en page correspond au préfixe du nom du contrôleur, par exemple, Grails appliquera la mise en page à chaque vue gérée par ce contrôleur. Malheureusement, cela s'applique même au texte et aux modèles. Il y a actuellement quelques JIRA enregistrées à ce sujet (voir http://jira.grails.org/browse/GRAILS-7624 par exemple). J'ai été brûlé par ceci aujourd'hui. Je l'ai résolu en renommant simplement ma mise en page gsp de telle sorte qu'elle ne corresponde à aucun nom de contrôleur. Ma mise en page s'appelait initialement 'storefront.gsp' et j'ai un contrôleur nommé StorefrontController. J'ai renommé la disposition en 'public.gsp'.