Select AJAX - Ajuda para editar um formulário
08/05/2015 19:38
0
Pessoa, estou com problemas para editar um formulado que tem um select que faz referencia a outra tabela. Neste caso, eu estou tentando editar a Tabela Localidade,  que pertence a uma Cidade, logo, existe um select no Formulário utilizado para cadastrar e editar. Para cadastrar está OK, pois o select mostra todas as Cidade. Porém para editar, não consigo fazer com que todos os dados da tabela de Locodade sejam preenchidos no formulario (neste caso a cidade não está sendo preenchida). Apenas a lista normal de cidades é mostrada, mas só dá certo se quando for editar, você selecionar a mesma cidade. Se tentar mudar, o seguinte erro é exibido:

....Error 
|
2015-05-08 19:20:24,511 [http-bio-8080-exec-4] ERROR errors.GrailsExceptionResolver  - HibernateException occurred when processing request: [POST] /ProjetoAeP/localidade/salvar - parameters:
cidadeid: 39
nome: Neopolis
id: 32
identifier of an instance of projetoaep.Cidade was altered from 1 to 39. Stacktrace follows:
Message: identifier of an instance of projetoaep.Cidade was altered from 1 to 39
Line | Method


Tente fazar com que a select já ficasse preenchido com a Cidade correspondente mas também sem sucesso. Abaixo segue o código do controller e das GsPs

Controller:

package projetoaep
class LocalidadeController {
def index() {
  def lista = Localidade.list()
  render(view: "/localidade/index", model: [localidades: lista])
}
def alterar(){
  Localidade localidade = Localidade.get(params.id)
  localidade.nomeLocalidade
  //localidade.cidade = Cidade.get()
//  println localidade.cidade.nomeCidade + "TESTE#"
  render(template: "/localidade/form", model: [localidade:localidade])
}
def excluir()
{
  Localidade localidade = Localidade.get(params.id)
  localidade.delete(flush: true)
  def lista = Localidade.list()
  render(view: "/localidade/index", model: [localidades: lista])
}
def adicionar(){
  Localidade localidade = new Localidade()
  localidade.cidade?.nomeCidade = ""
  localidade.nomeLocalidade = ""
  render(template: "/localidade/form" , model: [localidade: localidade])
}
def lista(){
  def teste = Localidade.list()
  render(template: "/localidade/lista", model: [localidades: teste])
}
def salvar(){
  Localidade localidade = null
  if(params.id)
  {
localidade = Localidade.get(params.id)
localidade.cidade.id = params.cidadeid.toInteger()
  }
  else
  {
localidade = new Localidade()
localidade.cidade = new Cidade()
  }
  localidade.cidade.id = params.cidadeid.toInteger()
  localidade.nomeLocalidade = params.nome
 localidade.validate()
  if(!localidade.hasErrors())
  {
localidade.save(flush:true)
render("Salvo com sucesso <br/>")
  }
  else{
render(localidade.errors)
  }
}
}


_form

<%@ page import="projetoaep.Localidade; projetoaep.Cidade" %>
<div id="divMensagem"></div>
<br/>
<g:formRemote name="frmLocalidade" url="[controller: 'localidade', action: 'salvar']" update="divMensagem"
  onSuccess="carregarLista()">
Cidade <g:select name="cidadeid" optionKey="id" from="${Cidade.list()}" noSelection="['null':'Selecione uma Cidade']" > </g:select> <br/>
Localizacao <input type="text" name="nome" value="${localidade.nomeLocalidade}"/> <br/>
<input type="submit" name="btnSalvar" value="Salvar"/>
<input type="button" name="btnCancelar" value="Cancelar" onclick="cancelar()"/>
<input type="hidden" name="id" value="${localidade.id}"/>
</g:formRemote>


_lista


<g:if test="${localidades.size() > 0 }">
<table>
<tr>
  <th>Cidade</th>
  <th>Localizacao</th>
  <th>Acoes</th>
</tr>
<g:each var="localidade" in="${localidades}">
<tr>
  <td>${localidade.cidade?.nomeCidade}</td>
  <td>${localidade.nomeLocalidade}</td>
  <td>
<g:remoteLink controller="localidade" action="alterar" update="divform" id="${localidade.id}"> Alterar </g:remoteLink>
 
<a href="#" onclick="excluir('${localidade.id}')" >Excluir</a>
  </td>
</tr>
</g:each>
</table>
</g:if>
<g:else>
<br>
Nenhuma localidade cadastrada
</g:else>


Obrigado desde já :D
Tags: grails, select, ajax, edit


0
Na verdade é mais um descuido na hora de programar do que uma falha propriamente dita. Isso ocorre pois está tentando alterar o código da Cidade no momento em que vai salvar neste ponto:
localidade.cidade.id = params.cidadeid.toInteger()

Isso faz com que a exception seja lancada. Você não deve alterar o id da cidade.
Espero que tenha lhe ajudado e boa sorte com o projeto.
Att



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