Grails "render" отображает шаблон

В моем контроллере Grails я отвечаю на вызов AJAX и используя render, чтобы вернуть текст:

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

Проблема заключается в том, что render отображает весь шаблон. Поэтому вместо простого рендеринга "Имя: Джон" он отображает все значки, навигация и т.д., Определенные в шаблоне. Как мне получить render только рендеринг без шаблона?

В значительной степени я следую главе 1 "Grails in Action" (стр. 28), используя Grails 1.1.1.

Последующие действия: Возвращение ложного предложения Rhysyngsun не оказывает никакого влияния. Я также попытался установить шаблон равным null, но он все равно отображает шаблон:

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

render имеет свое сердце, стремящееся сделать его через шаблон независимо от того, что я делаю.

Follow up 2: Параллельное обсуждение в списке рассылки grails-user.

Follow up 3: Пример кода: Я сократил мой код до минимума и все еще демонстрирует нежелательный отрисовку шаблона.

Контроллеры/PersonController.groovy:

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

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

views/person/home.gsp(просмотр страницы для домашнего метода)

<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(шаблон макета для персонального контроллера)

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

Я получаю доступ к контроллеру пользователя с домашним видом: http://localhost:8080/test/person/home

страница отображается как: Тестовое приложение ajax call (гиперссылка) Сообщение = Привет Пустое

"Test App" из шаблона. Когда я нажимаю "ajax call", он вызывает асинхронный вызов метода ajaxTest PersonController (проверяется с помощью println). Все ajaxTest делает println и визуализирует статический текст. Это приводит к следующему:

Test App 
ajax call 
Message = Hello 
Test App 
ajax message 

Обратите внимание, что шаблон отображается в "test1" <p>, что приводит к второму "тестовому приложению".

Я запускаю Grails 1.1.1. Есть идеи? Код кажется простым. Я загрузил источник Grails и посмотрел на RenderDynamicMethod.java. Он не выполняет рендеринг шаблонов, если только шаблон не указан в списке аргументов, а это не так. Так что моя единственная догадка - это то, что пара снова отображает шаблон.

Ответ 1

Решено: добавление contentType приводит к тому, что шаблон не отображается:

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

Ответ 2

Сделайте свой код javascript на стороне клиента обработкой JSON и ответьте на него:

render [текст: "Имя: ${person.name}" ] как JSON

Ответ 3

Возможно, вы сожгли функцию "компоновка по конгрессу" в Grails. Если ваше имя макета соответствует префиксу имени контроллера, например, Grails применит макет к каждому виду, управляемому этим контроллером. К сожалению, это даже относится к тексту и шаблонам. В настоящее время существует несколько JIRAs, связанных с этим (см. http://jira.grails.org/browse/GRAILS-7624). Сегодня меня сожгли. Я решил это, просто переименовав свой макет gsp таким образом, чтобы он не соответствовал имени контроллера. Мой макет изначально назывался "storefront.gsp", и у меня есть контроллер с именем StorefrontController. Я переименовал макет в "public.gsp".

Ответ 4

Мы обнаружили, что явное возвращение false из действия исправляет это.

Я считаю, что делать render foo, поскольку JSON возвращает false неявно.