Problemas ao atualizar dados com dataBinding no Grails
14/08/2014 14:17
0
Boa tarde galera tenho os seguintes dominios:

class Cliente {

static belongsTo = [empresa: Empresa]

static constraints = {
}
}


class Empresa {

/* aqui temos alguns atributos*/

}

Ao criar um novo registro da classe empresa consigo fazer de boa:

Empresa empresa = new Empresa(params)
empresa.save(flush:true)


mas ao tentar atualizar esse registro:

Empresa empresa = Empresa.get(params.id)

/* ja tentei de todas essas maneiras */

empresa.properties = params
empresa = params
dataBind(empresa,params)
dataBind(empresa,params, exclude:[empresa.id]) // ja tentei com include em td tbm
dataBind(empresa.properties, params)


Também ja tentei colocar a propriedade bindable: true nas constraints mais de nada resolveu, algumas vezes da erro e outras simplesmente não atualiza os dados, versão do grails: 2.4.2
Tags: dataBind, gorm


1
Olá José,
Já tentou
bindData(empresa,params)
14/08/2014 15:17


0
Outro ponto.

Para que o bindData funcione corretamente você precisa seguir uma padronização no seu formulário, de nomenclatura.

Se você vai fazer uma edição, não precisa buscar a domain novamente, quando você salvar ela, o GORM sabe que como o ID está preenchido, vc está atualizando o registro apenas.

Pode ser encontrado aqui


0
Desculpe é o a função bindData que teste, digitei errado


0
Carlos, acredito que a nomenclatura do meu form esteja correta pois na inserção de um novo registro tudo funciona perfeitamente com o data binding.
Sobre utilizar o .get ja tentei fazer do mesmo modo que fiz na criação como mostrei acima porém tbm não funciona.


0
Olá José Carlos,

O que já aconteceu comigo algumas vezes é o objeto estar com erro e eu não ter verificado com o método hasErrors(), ai o grails não persiste, vc está fazendo essa verificação?

Confira no debug se o objeto é setado corretamente depois que passa pelo bind e, se for, confira o atributo "errors" dele.
15/08/2014 10:24


0
Sim na hora de salvar eu ja verifico e se der erro eu dou render neles ;s


0
Olha fui ver aqui tava dando render só na hora de criar um novo e não na hora de alterar, mas tenho o seguinte problema, se eu crio um novo objeto e salvo ele da conflito em alguns campos que deveriam ser unicos, se eu ja puxo o objeto pelo .get ele diz que todos os campos estão nulos


0
Olá José Carlos,

Nos meus updates eu costumo fazer um


def instance = DomainClass.findById(params.id) // o mesmo que o seu get


e depois uso


bindData(instance, params)


e funciona legal.

Tenta isso, se não funcionar passa o código completo do se update pra eu dar uma olhada.
18/08/2014 15:11


0
aqui o link do projeto

https://drive.google.com/file/d/0B8fgwfUpccYBOURodjlSMzFMdnc/edit?usp=sharing


1
José Carlos, tente usar o scaffolding, ele vai gerar uma controller padrão para vc, que pode ser customizada posteriormente.

O scaffolding é uma ferramenta muito útil do grails e vai te economizar muito trabalho.

Na controller gerada, vc vai encontrar várias boas práticas que aconselho que vc use em suas futuras controllers.

Para gerar uma controller pelo eclipse, clique com o botão direito do mouse na sua DomainClass e depois vá em New -> Generate Controller.

Você também pode gerar view por lá, com isso vc já vai ter um cadastro básico funcionando.

Mais informações em:
http://grails.org/doc/latest/guide/scaffolding.html
18/08/2014 17:51


0
def salvar() {
def cliente = Cliente.get(params['id']) ?: new Cliente() //se o get() retornar uma empresa ele devolve a empresa do banco senão cria uma nova empresa
bindData(cliente, params)

try {
cliente.save(flush: true, failOnError: true)
redirect action: 'listar' //ou qualquer outra forma que estiver usando.
return
} catch(ex) {
log.error(ex.message, ex)
response.status = 500 //Erro interno do servidor
render template: 'template', model: [cliente: cliente] //Retorna para o formulário com os erros.
return
}
}


Fique atento aos seus formulários de alterar/novo pois eles são iguais. Reaproveite este código em um template para mais fácil manutenção do seu código.

No formulário coloque os nomes dos inputs da seguinte forma:

name="empresa.cnpj"

name="empresa.nome"


Isso vai fazer o seu binding.

Espero que tenha lhe ajudado e boa sorte com o projeto.


0
Obrigado pela ajuda pessoal, acabei usando a implementação do Carlos, porém não mudei o nome das inputs, o código ainda esta meio bagunçado pq não estou tratando erros ainda, quando iniciar essa parte eu dou uma refatorada ;)

	def salvar() {
def empresa = Empresa.get(params['id']) ?: new Empresa()
bindData(empresa, params)
try {
empresa.save(flush: true, failOnError: true)
if (Cliente.findByEmpresa(empresa)) {
redirect(action: 'index')
} else {
def cliente = new Cliente()
bindData(cliente, empresa)
cliente.save(flush: true, failOnError: true)
redirect(action: 'index')
}
} catch(ex) {
log.error(ex.message, ex)
response.status = 500
render ex
}
}



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