Não estou conseguindo salvar na base de dados
30/01/2013 17:27
0
Tenho o seguinte código gsp que é um include, quando tento persistir com a tag g:link dá erro e com o submitToRemote nem funciona. Alguém poderia analisar o código e me dizer qual é o problema. No console não esta exibindo o erro.

Agradeço imensamente.

<tr class="prop">
<td valign="top" class="name2"><g:hiddenField name="id" value="${encaminhamentoInstance?.id}" />
<label for="nome"><g:message code="encaminhamento.localOrgaoEncaminhamento.label" default="Local / Orgão de Encaminhamento" /></label>
</td>
<td valign="top" class="value2 ${hasErrors(bean: encaminhamentoInstance, field: 'localOrgaoEncaminhamento', 'errors')}">
<g:textField name="nome" value="${encaminhamentoInstance?.localOrgaoEncaminhamento}" />
</td>
</tr>
<tr class="prop">
<td valign="top" class="name2">
<label for=horaDataChegada><g:message code="encaminhamento.dataHoraChegada.label" default="Data / Hora de Chegada" /></label>
</td>
<td valign="top" class="value2 ${hasErrors(bean: encaminhamentoInstance, field: 'horaDataChegada', 'errors')} espacoBotaoMais">
<g:textField name="horaDataChegada" class="dataHoraMinuto" value="${encaminhamentoInstance?.horaDataChegada}" />
</td>
<td valign="top" class="name2">
<label for="horaDataSaida"><g:message code="encaminhamento.horaDataSaida.label" default="Data / Hora de Saída" /></label>
</td>
<td valign="top" class="value2 ${hasErrors(bean: encaminhamentoInstance, field: 'horaDataSaida', 'errors')} espacoBotaoMais">
<g:textField name="horaDataSaida" class="dataHoraMinuto" value="${encaminhamentoInstance?.horaDataSaida}" />
</td>
</tr>
<tr class="prop">
<td>
<g:submitToRemote update="encaminhamentos" url="[controller:'encaminhamento', action:'salvar']" value="Adicionar"/>
<g:link url="[controller:'encaminhamento', action:'salvar']" action="salvar">Salvar</g:link>
</td>
</tr>
<div id="encaminhamentos">
<g:if test="${encaminhamentos}">
<br/>
<h3>Encaminhamentos Adicionados</h3>
<div class="list">
<table>
<thead>
<tr>
<g:sortableColumn property="localOrgaoEncaminhamento" title="encaminhamento.localOrgaoEncaminhamento.label" />
<g:sortableColumn property="dataHoraChegada" title="encaminhamento.dataHoraChegada.label" />
<g:sortableColumn property="dataHoraSaida" title="encaminhamento.horaDataSaida.label" />
</tr>
</thead>
<tbody>
<g:each in="${searchresults}" status="i" var="encaminhamentoInstance">
<tr class="${(i % 2) == 0 ? 'odd' : 'even'}">
<td><g:link action="show" id="${encaminhamentoInstance.id}">${fieldValue(bean: encaminhamentoInstance, field: "id")}</g:link></td>
<td>${fieldValue(bean: encaminhamentoInstance, field: "localOrgaoEncaminhamento")}</td>
<td>${fieldValue(bean: encaminhamentoInstance, field: "horaDataChegada")}</td>
<td>${fieldValue(bean: encaminhamentoInstance, field: "horaDataSaida")}</td>
</tr>
</g:each>
</tbody>
</table>
</div>
</g:if>
</div>


///////////////////////////////////////////////////////////////////////////////////////

package br.com.geocontrol.tro

class EncaminhamentoController {

static allowedMethods = [save: "POST", update: "POST", delete: "POST"]

List<Encaminhamento> encaminhamentos = new ArrayList<Encaminhamento>();

def salvar = {

def encaminhamentoInstance = new Encaminhamento(params)
//Não salva
if (encaminhamentoInstance.save(flush: true)) {
encaminhamentos << encaminhamentoInstance;
}
redirect(controller: "tro", action: "create")
}

def show = {
def encaminhamentoInstance = Encaminhamento.get(params.id)
if (!encaminhamentoInstance) {
flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'encaminhamento.label', default: 'Encaminhamento'), params.id])}"
redirect(action: "tro")
}
else {
[encaminhamentoInstance: encaminhamentoInstance]
}
}
}




Tags: erro ao persistir


0
Franklin só pra ter uma idéia do que está chegando no seu controller salvar, coloque no salvar, antes de tudo um :


println params


E mande aqui pra gente ter uma idéia do que está acontecendo.
30/01/2013 18:14


1
pra achar mais facil tenta:

encaminhamentoInstance.validate()
encaminhamentiInstance.errors.each{println it}


ou
encaminhamentoInstance.save(flush: true, failOnError:true)
30/01/2013 18:37


1
@Franklin

O Grails usa o padrão ActiveRecord (http://www.martinfowler.com/eaaCatalog/activeRecord.html), onde a própria entidade é responsável por se salvar. Isso encoraja o uso de DDD mas pode soar estranho pra muitos desenvolvedores Java acostumados a lidar com Hibernate Session ou Persistance Manager do JPA.

O problema é que o método domain.save() falha silenciosamente caso haja algum problema. Este foi um dos comportamentos herdados do Rails que eu considero uma falha de design do Grails.

O problema hoje é facilmente contornado com a dica do Mussatto do save(failOnError:true). O problema é que a tendência é usar isso em todo dominio.save() gerando uma grande repetição de código, que fere o princípio DRY (Don't Repeat Yourself).

A solução ideal seria ativar failOnError em todos os save() automaticamente sem necessidade de explicitar no código. Para isso basta adicionar o parâmetro abaixo no arquivo /grails-app/conf/Config.groovy

grails.gorm.failOnError=true


Fonte: GORM Configurations

Desta forma todos os saves irão falhar em caso de erro. Então basta usar o try/catch normalmente. Este parâmetro é obrigatório em todo sistema que desenvolvo pois elimina muitos problemas como o que você reportou.

Para sistemas que já estão rodando, isso pode trazer problema em outros locais que não tratam a exceção, portanto esteja preparado para ajustes de regressão ou então faça alteração pontual.

PS.: Me parece que este parâmetro é suportado globalmente a partir da versão 1.3. Avalie a sua versão e o suporte a este parâmetro global.


0
Se estiver usando GGTS ou IntellijIdea pode rodar o "run-app" em modo debug e por um breakpoint na linha após o save().

Assim, ao analisar o objeto vai ver que ele tem um atributo "errors". Simples assim ;)



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