Ajuda sobre o tutorial do Kiko --> http://www.itexto.net/devkico/?p=885
02/08/2012 19:04
0
Kiko eu tentei criar essa pagina das classes acima que vc criou pra esse exemplo só que na unha, mas não consegui, mas estou tentando. Voce poderia me dizer por favor como fazer a controller na unha? Não consegui fazer a consulta tb :S mas eu tentei algo assim:

def consultar() {
def result = ['status': 1, 'mensagem': '', 'pai': null]
def pai = Pai.findAllByPai(params.id)
if (pai) {
result.pai = pai
} else {
result.status = 2
result.mensagem = 'Código não localizado'
}

render result as JSON
}


def salvar() {
def result = ['status': 1, 'mensagem': '']

if (!params.nome) {
result.status = 2
result.mensagem = 'Informe o Nome do Banco'


} else {

def pai = Pai.get(params.id)
if (!pai) {
pai = new Pai(params)
pai.filho = new Filho(params)
pai.neto = new Neto(params)
pai.properties = params


pai.save()
result.mensagem = 'Cadastro adicionado'

} else {
pai.properties = params
pai.merge()
result.mensagem = 'Cadastro atualizado'
}
if (!pai.save()) {
pai.errors.each {
println it
}
}
}
render result as JSON
}


Mas ta dando erro e as vezes salva somente a tabela pai e as outras ficam vazias, desde ja parabens pela materia. Aguardo contato abraços.
Tags: Salvar, controller, classes, busca, consultar


0
Oi Silas, qual é exatamente o seu problema?


0
Oi kiko muito prazer, eu quero construir seu exemplo só que na mão, sem usar a automação do grails, eu criei a pagina index com todo os campos em uma mesma tela, estou trabalhndo com uma controller escrita na mao, java script e json, mas não to conseguindo fazer funcionar nao to conseguindo fazer a busca e fazer a controlle salvar os dados digitados, mas estou persisitindo e algumas dicas são bem vindas :) se precisar do codigo de tudo te passo.
02/08/2012 19:42


0
Hmm... saquei.

Bom, pra criar as actions sem o scaffolding (eu até recomendo), basta que você saiba o básico do fluxo. Sugiro que você dè uma lida na seção sobre web e controladores da documentação oficial: é o melhor texto que conheço a respeito, e você pode acessá-lo neste link.


0
Okay Kiko agadeço de qq forma pela resposta, eu tenho a documentação toda impressa ao meu lado, eu ja fiz o codigo só queria umas dicas do pessoal mais avançado o porque que esta dando erro no metodo salvar, talvez seja a forma de relacionamento, nao to sabendo criar ou setar os novos objetos para serem todos salvos de uma vez só, puxando os dados do pai filho e neto da mesma index e salvando com o mesmo metodo numa tacada só. Mas de qq forma obrigado ^^
02/08/2012 20:13


0
Oi Silas, poderia postar o trecho do código ou o erro para que o pessoal pudesse ter mais embasamento para poder ajudar ?
02/08/2012 20:28


0
Opa Pedro to enviando o codigo pra vc:)

def consultar() {
def result = ['status': 1, 'mensagem': '']
def pai = Pai.findAllByNome(params.id)
if (pai) {
result.pai = pai
} else {
result.status = 2
result.mensagem = 'Código não localizado'
}

render result as JSON
}

def salvar() {
def result = ['status': 1, 'mensagem': '']

if (!params.nome) {
result.status = 2
result.mensagem = 'Informe o Nome do Banco'


} else {

def pai = Pai.get(params.id)

if (!pai) {
pai = new Pai(params)
pai.filho = new Filho(params)
pai.neto = new Neto(params)
pai.save()
result.mensagem = 'Cadastro adicionado'

} else {
pai.properties = params
pai.merge()
result.mensagem = 'Cadastro atualizado'
}
if (!pai.save()) {
pai.errors.each {
println it
}
}
}
render result as JSON
}


Explicando: eu criei as classes como esta no projeto do kiko, ta criando certinho no BD, eu criei uma index com todos os campos necessarios para cada classe - mas pára classe filho usei uma diversificação colocando o nome nos campos como filho.nome - e neto.nome. o erro é esse:

Error 2012-08-02 21:05:09,571 [http-bio-8080-exec-3] ERROR errors.GrailsExceptionResolver - GroovyCastException occurred when processing request: [POST] /Teste/pai/salvar - parameters:
id:
neto.nome: p
filho.sobrenome: p
sobrenome: p
neto.status: p
filho.idade: 15
neto.sobrenome: p
filho.nome: p
nome: p
Cannot cast object 'p' with class 'teste.Filho' to class 'java.util.Set'. Stacktrace follows:
Message: Cannot cast object 'p' with class 'teste.Filho' to class 'java.util.Set'
Line | Method
->> 42 | salvar in teste.PaiController
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 195 | doFilter in grails.plugin.cache.web.filter.PageFragmentCachingFilter
| 63 | doFilter in grails.plugin.cache.web.filter.AbstractFilter
| 1110 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 603 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^ 722 | run in java.lang.Thread



Desde já agradeço sua atenção :)
02/08/2012 21:09


0
Silas, tente substituir

new Filho(params)


por

new Filho(nome:params.filho.nome, sobrenome: params.filho.sobrenome, idade: params.filho.idade) 


use a mesma semântica para Neto caso não ache muito elegante, existe o bindData que é o que geralmente eu uso, a sintaxe está aqui explicadíssima neste post ;-) Secure Data Binding with Grails
02/08/2012 23:05


0
Opa amigo Pedro agradeço sua ajuda e espero mais rssss infelizmente não funcionou e estou te passando o codigo para verificar:

def pai = Pai.get(params.id)

if (!pai) {
pai = new Pai(params)
pai.filho = new Filho(nome:params.filho.nome, sobrenome: params.filho.sobrenome, idade: params.filho.idade)
pai.neto = new Neto(nome:params.neto.nome, sobrenome: params.neto.sobrenome, status: params.neto.status)
pai.save()

result.mensagem = 'Cadastro adicionado'

Agora ta dando o seguinte erro:

| Error 2012-08-02 20:37:39,953 [http-bio-8080-exec-3] ERROR errors.GrailsExceptionResolver - GroovyCastException occurred when processing request: [POST] /Teste/pai/salvar - parameters:
id:
neto.nome: p
filho.sobrenome: p
sobrenome: p
neto.status: p
filho.idade: 15
neto.sobrenome: p
filho.nome: p
nome: p
Cannot cast object 'p' with class 'teste.Filho' to class 'java.util.Set'. Stacktrace follows:
Message: Cannot cast object 'p' with class 'teste.Filho' to class 'java.util.Set'
Line | Method
->> 42 | salvar in teste.PaiController$$ENeytwXw
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 195 | doFilter in grails.plugin.cache.web.filter.PageFragmentCachingFilter
| 63 | doFilter in grails.plugin.cache.web.filter.AbstractFilter
| 1110 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 603 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^ 722 | run in java.lang.Thread

Continuo na persistencia ahahaha abraços
02/08/2012 23:43


0
Essas são as minhas domains:


package teste

class Pai {

String nome
String sobrenome

static hasMany = [filho:Filho]

String toString() {this.nome}

static constraints = {
}
}



package teste

class Filho {

String nome
String sobrenome
Integer idade

static belongsTo = [pai:Pai]

static hasMany = [filho:Neto]

String toString() {this.nome}

static constraints = {
}
}




package teste

class Neto {

String nome
String sobrenome
String status

static belongsTo = [pai:Filho]

String toString(){this.nome}

static constraints = {
}
}

02/08/2012 23:46


0
Seu domain Pai hasMany filho, seria legal escrever filhos, pois um pai tem uma lista de filhos, e belongsTo (pertence a) pai Ok.

O erro que está dando é que você está tentando atribuir um objeto filho a um Set(lista) de filhos para tanto deveria fazer assim.


Após as mudanças sugeridas, fazer o seguinte código :

def pai = Pai.get(params.id)

if (!pai) {
pai = new Pai(params)
Filho filho = new Filho(nome:params.filho.nome, sobrenome: params.filho.sobrenome, idade: params.filho.idade)
pai.addToFilhos( filho )
Neto neto = new new Neto(nome:params.neto.nome, sobrenome: params.neto.sobrenome, status: params.neto.status)
filho.addToFilhos( neto )
pai.save(flush:true)

result.mensagem = 'Cadastro adicionado'
03/08/2012 01:40


0
Oi Silas,

uma fonte de informação valiosíssima pra você é a série de artigos chamados "GORM Gotchas" publicados pelo pessoal da Spring Source.

Neles é exposto o funcionamento detalhado do GORM e muitas das dúvidas que você tem estão lá. É leitura obrigatória pra todo "graileiro" :)

Seguem os links:

http://blog.springsource.org/2010/06/23/gorm-gotchas-part-1/

http://blog.springsource.org/2010/07/02/gorm-gotchas-part-2/

http://blog.springsource.org/2010/07/28/gorm-gotchas-part-3/


0
Opa Pedro muito obrigado pela ajuda esta funcionando bonitinho, ainda to correndo atras de fazer uma consulta por um campo codigo que criei mas ta otimo muito obrigado mesmo. Eu tenho mais um pedido de ajuda só pra eu matar esse lance de relacionamento. Em vez de relacionamento hasMany eu tivesse apenas um relacionamento has one, tipo static hasOne = [filho:Filho,Neto:neto], como eu deveria proceder pois estou testanto essa forma agora rss. To saindo do basico querendo ir pro intermediário e to cheio de duvidas :). Kiko muito obrigado pelas dicas vou ler sim.
Abraços
03/08/2012 14:30


0
Disponha Silas, nestes links que o Kiko passou, tem ensinando como fazer pesquisas, no site dele também tem um excelente tutorial.
03/08/2012 18:09


0
ola amigos eu tenho uma ultima duvida pra poder fechar esse post, gostaria de dizer que consegui tb fazer o codigo de one to one um pai e dois filhos. Minha duvida é a seguinte:
Eu envio o codigo da index por java script:
JavaScript:

salvar: function() {
$('#form-pai').form('submit',{
url: paiScript.urls['salvar'],
success: function(data) {
data = eval('('+data+')');
if (data.status==1) {
paiScript.novo()
}
alert(data.mensagem);
}
});
},

controller:

def salvar() {
def result = ['status': 1, 'mensagem': '']

if (!params.nome) {
result.status = 2
result.mensagem = 'Informe o Nome do Banco'


} else {

def pai = Pai.get(params.id)

if (!pai) {
pai = new Pai(params)
Filho filho = new Filho(nome:params.filho.nome, sobrenome: params.filho.sobrenome, idade: params.filho.idade)
pai.addToFilhos(filho)
Neto neto = new Neto(nome:params.neto.nome, sobrenome: params.neto.sobrenome, status: params.neto.status)
filho.addToFilhos(neto)
pai.save(flush:true)

result.mensagem = 'Cadastro adicionado'

} else {
//pai.properties = params
pai.merge()
result.mensagem = 'Cadastro atualizado'
}
if (!pai.save()) {
pai.errors.each {
println it
}
}
}
render result as JSON
}



Segundo minhas pesquisas o JS envia todo os dados da pagina para controller então a duvida é a seguinte:
Por que devo colocar os parametros se o JS envia os dados? Não era para salvar automaticamente sem colocar os parametros?
Lembre-se amigos eu sou novato indo pro intermediário se a pergunta for sem nexo ahahahah me perdoeem e se puderem ajudar para fecharmos esse tópico eu gostaria de saber como fazer o update cascade porque não ta funcionando la com o merge e nem a consulta puxa todos os dados.
Desde já agradeço as pessoas que ajudaram, ajudam e ajudarão o Graisl a se tornar muito mais forte :) Bom dia.
04/08/2012 13:48


0
Oi Silas, vou aproveitar para fazer um merchandising, rs, eu estou montando um curso de Grails lá no Edukee, Olha o seu JS manda os dados para o controller certo ? Quando você envia dados para um servlets tem Attributes e Paramters, os atributos são read-only, os parâmetros são esses dados que você manda pelo seu submit(entre outros que o grails coloca, como o controller), então daí o seu controller recebe a requisição desempacota esses dados e faz o que você precisa (manda pra outro lugar, grava, etc.) então por isso precisa dos parâmetros, olha pra você realmente não se encrencar uma hora com o grails é preciso entender como funciona o básico da estrutura do framework o MVC, Domain, Controllers e Services pelo menos (a view é HTML, mas tem suas particularidades de renderização).

Então uma lida na documentação seria muito legal, e como eu indiquei, o material do Kiko, é de excelente qualidade, este é o link.
04/08/2012 20:03



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