2009-09-23 7 views
10

In meinem Grails Controller ich einen Ajax-Aufruf bin reagiert und mit render den Text zurück:Grails „render“ macht die Vorlage

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

Das Problem ist, dass render die ganze Vorlage macht. Anstatt also nur "Name: John" zu rendern, werden alle in der Vorlage definierten Symbole, Navigation usw. gerendert. Wie bekomme ich render nur ohne die Vorlage zu rendern?

Ich folge ziemlich genau Kapitel 1 von "Grails in Action" (Seite 28) mit Grails 1.1.1.

Nachverfolgung: Die Rückgabe von false per Vorschlag von Rhysyngsun hat keine Auswirkungen. Ich habe versucht Einstellung auch die Vorlage auf null, aber es macht immer noch die Vorlage:

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

render hat sein Herz gebogen auf sich durch die Vorlage zu machen, egal was ich tue.

Follow-up 2: Parallel discussion auf Grails-Benutzer-Mailing-Liste.

Nachverfolgung 3: Beispielcode: Ich packte meinen Code das Minimum und es zeigt immer noch die unerwünschte Vorlage Rendering.

Controller/PersonController.groovy:

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

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

views/Person/home.gsp (siehe Seite für Heim Methode)

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

Ansichten/Layouts/person.gsp (Layout-Vorlage für Person Controller)

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

ich Zugriff Person Controller mit der Wohnansicht: http://localhost:8080/test/person/home

die Seite rendert als: Test App Ajax-Aufruf (Hyperlink) Message = Hallo Blank

"Test App" aus der Vorlage ist. Wenn ich auf "ajax call" klicke, macht es einen asynchronen Aufruf von PersonControllers ajaxTest-Methode (verifiziert mit println). Alles was ajaxTest macht ist println und rendert statischen Text. Das sich ergebende in der folgenden:

Test App 
ajax call 
Message = Hello 
Test App 
ajax message 

Hinweis, dass die Vorlage innerhalb von „Test1“ <p> gerendert wird, die in der zweiten „Test App“ führt.

Ich renne Grails 1.1.1. Irgendwelche Ideen? Der Code scheint einfach zu sein. Ich habe die Grails-Quelle heruntergeladen und RenderDynamicMethod.java angesehen. Es führt kein Template-Rendering aus, es sei denn, die Vorlage befindet sich in der Argumentliste, was nicht der Fall ist. Also meine einzige Vermutung ist, dass Up-Stream die Vorlage erneut rendert.

Antwort

13

gelöst: Hinzufügen von content führt in der Vorlage nicht wiedergegeben wird:

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

woher weißt du das? –

+4

Ja, bitte erläutern Sie, wo Sie diese Antwort gefunden haben. Nebenbei bemerkt, es ist eine absolute Schande, dass Kapitel 1, das mich 30 Minuten gekostet haben sollte, Stunden gedauert hat. Und ich bin völlig enttäuscht von meinem ersten Stich bei Grails –

0

Wir haben festgestellt, dass die explizite Rückgabe von false aus der Aktion das Problem behebt.

Ich glaube tun Render Foo als JSON implizit falsch zurückgibt.

+0

Ich habe gerade versucht, nach dem Rendern false zurückzugeben, und es rendert immer noch die Vorlage. –

3

Sie Ihr Client-Seite JavaScript-Code, um einen JSON reagieren handhaben und machen Sie Ihre Antwort mit:

machen [Text: "Name: $ {person.name}"] als JSON

2

Sie könnten durch die ‚Layout-by-Konvention‘ -Funktion verbrannt werden immer in Grails. Wenn Ihr Layout-Name mit dem Präfix des Controllernamens übereinstimmt, wendet Grails das Layout beispielsweise auf alle Ansichten an, die von diesem Controller verwaltet werden. Leider gilt dies sogar für Texte und Vorlagen. Momentan sind einige JIRAs angemeldet (siehe zB http://jira.grails.org/browse/GRAILS-7624). Ich wurde heute davon verbrannt. Ich habe es gelöst, indem ich einfach mein Layout gsp so umbenannt habe, dass es keinem Controller-Namen entspricht. Mein Layout hieß ursprünglich "storefront.gsp" und ich habe einen Controller namens StorefrontController. Ich habe das Layout in 'public.gsp' umbenannt.

Verwandte Themen