Pergunta
Na minha Grails controlador Eu estou respondendo a uma chamada de AJAX e usando render
para retornar o texto:
def ajaxRandomPersonName = {
def person = get a random person ...
render "Name: ${person.name}"
}
O problema é que render
torna todo o modelo. Então, ao invés de apenas tornando "Nome: John" ele processa todos os ícones, navegação, etc definida no modelo. Como faço para obter render
apenas para tornar sem o modelo?
Estou praticamente seguinte Capítulo 1 do "Grails em Ação" (página 28) usando Grails 1.1.1.
Acompanhamento : Retornando falsa por sugestão de Rhysyngsun não tem impacto. Eu também tentou definir o modelo para nulo mas ainda torna o template:
def ajaxRandomPersonName = {
def person = get a random person ...
render (template:null, text:"Name: ${person.name}")
}
render
tem seu coração inclinado sobre tornando-o através do modelo não importa o que eu faço.
Acompanhamento 2 : discussão paralela na lista de discussão grails-usuário.
Acompanhamento 3 : Exemplo de código: Eu emparelhado para baixo meu código o mínimo e ainda exibe a prestação template indesejada.
Controladores / PersonController.groovy:
class PersonController {
def index = { }
def home = { [message:"Hello"] }
def ajaxTest = {
println "ajaxTest called"
render text: "ajax message"
}
}
views / pessoa / home.gsp (Página vista para o método de 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 / layouts / person.gsp (modelo de layout para o controlador pessoa)
<html>
<head>
<title>Test App - <g:layoutTitle/></title>
<g:layoutHead/>
</head>
<body>
<h1>Test App</h1>
<g:layoutBody/>
</body>
</html>
Eu controlador de acesso pessoa com a visão de casa: http: // localhost: 8080 / test / pessoa / home
a página é processada como: test App chamada ajax (hyperlink) Message = Olá Em branco
"Test App" é a partir do modelo. Quando eu clicar em "chamada ajax" faz uma chamada assíncrona para o método ajaxTest de PersonController (verificado com println). Todos ajaxTest faz é println e processar texto estático. Este resultante da seguinte:
Test App
ajax call
Message = Hello
Test App
ajax message
Note que o modelo está sendo processado dentro <p>
"test1", que resulta no segundo "Test App".
Estou correndo Grails 1.1.1. Alguma ideia? O código parece simples. Eu baixei a fonte Grails e olhou para RenderDynamicMethod.java. Ele não faz qualquer prestação modelo a menos que modelo está na lista de argumentos, o que não é. Então, meu único palpite é algo acima de vapor está prestando o modelo novamente.
Solução
Resolvido: Adicionando resultados ContentType no modelo não está sendo processado:
render text: "Name: ${person.name}", contentType: "text/plain"
Outras dicas
Faça o seu código javascript do lado do cliente pega a responder JSON e tornar a sua resposta com:
render [texto: "Nome: $ {person.name}"] como JSON
Você pode estar se ficar queimado pelo recurso 'layout de-by-convenção' em Grails. Se o seu nome de layout corresponde ao nome do controlador de prefixo, por exemplo, Grails irá aplicar o layout para cada ponto de vista gerido pelo controlador. Infelizmente, mesmo se aplica ao texto e modelos. Atualmente alguns JIRAs logado em relação a este (ver http://jira.grails.org/browse/ grails-7624 por exemplo). Eu fui queimado por isso hoje. Eu resolvi isso, basta renomear o meu gsp layout de tal forma que não corresponde a nenhum nome do controlador. Meu layout foi inicialmente denominada 'storefront.gsp' e eu tenho um controlador chamado StorefrontController. I renomeado o layout para 'public.gsp'.
Descobrimos que retornar explicitamente falsa das correções de ação isto.
Acredito que fazendo tornar foo como JSON retorna false implicitamente.