salvar recursivamente
11/11/2015 21:13
0
Boa noite,

Como faço para salvar objetos recursivamente.

Tentei dessa forma

FormularioController

def respostas(params){
def resp
def questao
params.each {
            if(it.key.equals("resposta")){
                resp=it.value.toString()
            }else if(it.key.equals("questao")){
                questao=it.value.toString()
            }

if(!resp?.isEmpty() && !questao?.isEmpty()){
println "teste"
def respostas = new Resposta(resposta:resp, questao:questao)
respostas.save()

println respostas

resp = null
questao = null
}
}

redirect controllerName:"Resposta", action:"index"
}

view: responder

<%@ page import="com.colhedados.formulario.Formulario"%>
<!DOCTYPE html>
<html>
<head>
<meta name="layout" content="main">
<g:set var="entityName" value="${message(code: 'formulario.label', default: 'Formulario')}" />
<title><g:message code="default.show.label" args="[entityName]" /></title>
<asset:stylesheet src="form.css"/>
<asset:stylesheet src="application.css"/>
<g:javascript>
   $(document).ready(function(){
    $('.form-btn').click(function(){
    ${remoteFunction(
    controller:'resposta',
    action:'save',
    params:this.value
    )}
    })
   });
</g:javascript>
</head>
<body>
<a href="#show-formulario" class="skip" tabindex="-1">
<g:message code="default.link.skip.label" default="Skip to content…" />
</a>

<div class="nav" role="navigation">
<ul>
<li>
<a class="home" href="${createLink(uri: '/')}">
<g:message code="default.home.label" />
</a>
</li>
<li>
<g:link class="list" action="index">
<g:message code="default.list.label" args="[entityName]" />
</g:link>
</li>
<li>
<g:link class="create" action="create">
<g:message code="default.new.label" args="[entityName]" />
</g:link>
</li>
</ul>
</div>

<div id="show-formulario" class="content scaffold-show" role="main">

<h1>
<g:message code="default.show.label" args="[entityName]" />
</h1>

<g:if test="${flash.message}">
<div class="message" role="status"> ${flash.message} </div>
</g:if>
<g:if test="${formularioInstance?.formulario}">
<h2 class="form-titulo">
<g:fieldValue bean="${formularioInstance}" field="formulario" />
</h2>
</g:if>
<g:if test="${formularioInstance?.nota}">
<div>
<g:fieldValue bean="${formularioInstance}" field="nota" />
</div>
</g:if>

<g:form url="[controller:'formulario', action:'respostas']" >

<g:if test="${formularioInstance?.questao}">

<g:each in="${formularioInstance.questao}" var="q">

<g:if test="${q.deletado == false}">

<span class="property-value" aria-labelledby="questao-label">
<g:message code="formulario.questao.label" default="Questao ${q.ordem}: ${q?.encodeAsHTML()}" />
</span>

<g:if test="${q.tipoQuestao.id == 1}">
<input type="hidden" name="questao.id" value="${q.id}">
<input type="number" class="form-number property-value" ${q.obrigatoria ? "required" : " "} name="resposta" min="1">
</g:if>

<g:if test="${q.tipoQuestao.id == 2}">
<input type="hidden" name="questao.id" value="${q.id}">
<g:textArea name="resposta" ${q.obrigatoria ? "required" : " "} class="form-textarea property-value" />
</g:if>

<g:if test="${q.tipoQuestao.id == 3}">
<div class="property-value">
<input type="hidden" name="questao.id" value="${q.id}">
<g:each in="${q.alternativa}" var="alter">
<label class="form-label"> 
<g:radio name="resposta" class="form-radio" value="${alter?.id}" id="${alter?.id}" />
${alter?.encodeAsHTML()}
</label>
<br>
</g:each>
</div>
</g:if>

<g:if test="${q.tipoQuestao.id == 4}">
<div class="property-value">

<input type="hidden" name="questao.id" value="${q.id}">
<g:each in="${q.alternativa}" var="alter">
<label class="form-label"> 
<g:checkBox name="resposta" class="form-checkbox" id="${alter?.id}" /> 
${alter?.encodeAsHTML()}
</label>
<br>
</g:each>

</div>
</g:if>
</g:if>
</g:each>
<center><input type="submit" class="form-btn" value="Enviar Respostas"></center>

</g:if>

</g:form>
</div>
</body>
</html>

Dados retornados no log

com.colhedados.formulario.Resposta: (unsaved)
Tags: Grails, recursive, save, multiple objects,ajax


1
Se você chamou save() e o objeto ainda está como não salvo, houve algum erro de validação. Dê uma olhada na propriedade errors do objeto após chamar save()
Outra coisa, experimente utilizar um command object e databind para não precisar poluir seu código processando os parametros e instanciando os objetos


0
Boa tarde tentei de várias formas salvar multiplos dados e não houve sucesso

Alguém tem uma dica de um plugin semelhante ao form-builder :https://code.google.com/p/jquery-form-builder-plugin/wiki/GettingStarted ?
Verificado o mesmo se encontra decontinuado e não atendeu a versão 2.5.0.
30/11/2015 17:08


0
O que exatamente acontece? Não salva NADA, ou salva apenas o objeto principal (aquele em quem você chamou .save()) mas não salva os relacionamentos?

Se for o primeiro caso, provavelmente é algum problema de validação, sugiro como teste usar save(failOnError: true) e ver o que sai no console. Se for o segundo caso, tem que ver como você definiu os relacionamentos por que provavelmente ele não está entendendo que deve ser cascade


0
Olá kico, atualmente está salvando todas as respostas de várias perguntas somente para a primeira resposta. Mesmo usando o save(failOnError: true) 

Já inseri dentro de um foreach e o resultado se mostra como unsaved. Caso seja sem o foreach acontece conforme relatado acima.
01/12/2015 12:35


0
So corrigindo Magno, atualmente está salvando todas as respostas de várias perguntas somente para a primeira resposta. Mesmo usando o save(failOnError: true) 

Já inseri dentro de um foreach e o resultado se mostra como unsaved. Caso seja sem o foreach acontece conforme relatado acima.
01/12/2015 12:36



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto