Ответ 1
Решено: добавление contentType приводит к тому, что шаблон не отображается:
render text: "Name: ${person.name}", contentType: "text/plain"
В моем контроллере 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. Он не выполняет рендеринг шаблонов, если только шаблон не указан в списке аргументов, а это не так. Так что моя единственная догадка - это то, что пара снова отображает шаблон.
Решено: добавление contentType приводит к тому, что шаблон не отображается:
render text: "Name: ${person.name}", contentType: "text/plain"
Сделайте свой код javascript на стороне клиента обработкой JSON и ответьте на него:
render [текст: "Имя: ${person.name}" ] как JSON
Возможно, вы сожгли функцию "компоновка по конгрессу" в Grails. Если ваше имя макета соответствует префиксу имени контроллера, например, Grails применит макет к каждому виду, управляемому этим контроллером. К сожалению, это даже относится к тексту и шаблонам. В настоящее время существует несколько JIRAs, связанных с этим (см. http://jira.grails.org/browse/GRAILS-7624). Сегодня меня сожгли. Я решил это, просто переименовав свой макет gsp таким образом, чтобы он не соответствовал имени контроллера. Мой макет изначально назывался "storefront.gsp", и у меня есть контроллер с именем StorefrontController. Я переименовал макет в "public.gsp".
Мы обнаружили, что явное возвращение false из действия исправляет это.
Я считаю, что делать render foo, поскольку JSON возвращает false неявно.