Bind de coleção de objetos com Grails

Muitas vezes os frameworks ágeis de programação web como Grails e Ruby on Rails ajudam muito nas operações CRUD simples. Você consegue rapidamente fazer criar, obter, alterar e apagar objetos de domínio com forms simples. Mas nas aplicações reais, fora dos "Hello World" usados nos exemplos, a gente se depara algumas vezes com a necessidade de fazer operações de CRUD em forms mais elaborados. Às vezes há casos que queremos reunir mais de um objeto de domínio num mesmo form, e há outros casos em que queremos reunir o mesmo objeto de domínio mais de uma vez: um exemplo seria salvar vários objetos Endereço de uma só vez.

Há uma maneira simples, usando o Grails, de se fazer o bind de uma coleção de objetos do mesmo tipo. Vamos a ela:

Neste exemplo, digamos que a gente queira salvar vários objetos Person de uma só vez, recebendo um post de um form único.

Crie um objeto helper em Groovy (um objeto comum que irá lhe ajudar nesta tarefa) como se segue:

class MyForm {
def personList = [new Person(), new Person()]
}



No arquivo GSP que terá o form, faça assim:
<input name="personList[0].firstname" value="Fred" />
<input name="personList[0].surname" value="Jones" />
<input name="personList[1].firstname" value="Bob" />
<input name="personList[1].surname" value="Smith" />


No controlador que irá receber o POST, você só precisará fazer o bind desta forma:
def form = new MyForm()
bind(form, params)



Pronto, simples assim. Desta forma você continua aproveitando o BIND automático do Grails (no fundo é Bind do Spring) e simplificando o código do seu controller.

[]s
Felipe

5 comentários:

Douglas 9 de abril de 2007 08:14

Otimo post Felipe! A propósito, voce ja fez forms com campos tipo 'autocomplete'? Como voce trabalha com Ajax no Grails?

Felipe Nascimento 9 de abril de 2007 13:24

Obrigado Douglas. Quanto ao autocomplete, eu tenho usado o Scriptaculous para fazer autocomplete com Ajax.
http://wiki.script.aculo.us/scriptaculous/show/Ajax.Autocompleter
É bem simples de ser feito.

Há um blog do Glen Smith falando disso com Yahoo UI e Grails:
http://blogs.bytecode.com.au/glen/2006/08/11/1155247345798.html

Fabrizio 8 de setembro de 2008 08:38

Parabens pelo post Felipe, tenho uma duvida.. tenho uma aplicação legada onde a logica fica no banco em store procedures.. Qual seria a melhor maneira de acessar essas procedures e fazer o bind com um formulario aproveitando as validações do modelo (mas esse modelo somente executaria as procedures sem necessidade de criar uma entidade no banco)? Comecei a utilizar o Grails a pouco tempo e estou gostando muito.. e seu blog é um dos mais completos que encontrei com informações úteis.. Valeu!

Fabrizio Colombo 17 de setembro de 2008 13:19

opa.. consegui encontrar a solução com a utilização de "command objects" (http://grails.org/doc/1.0.x/guide/single.html#6.1.9%20Command%20Objects). Valeu!

Felipe Nascimento 1 de outubro de 2008 11:10

Legal Fabrizio.
Obrigado por participar.
Abcs
Felipe