Dica Grails: parâmetros com nomes duplicados

Há situações nas quais é interessante ter mais de um parâmetro passado ao nosso controlador com o mesmo nome. Para ilustrar a situação, eis um exemplo: imagine que você deseje criar um sistema de cotação de itens aonde seja interessante fornecer ao usuário a possibilidade de cadastrar mais de um preço de uma única vez.

Vamos imaginar que a classe de domínio que desejamos popular seja a exposta no código abaixo:


class Cotacao {

String nome

BigDecimal valor

// ignoraremos o restante da classe apenas para manter a simplicidade ok?

}

O usuário irá fornecer o nome parcial dos itens cujos preços queremos editar e nós exporemos os dados no formulário como uma tabela. O controlador que envia os dados para a camada de visualização possui uma action tal como a exposta abaixo:


class CotacaoController {

def editarCotacoes = {

[cotacoes: Cotacao.findAllByNomeLike("%${params.valorBusca}%")]

}

}

E a nossa página GSP, bem bobona, possui um formulário tal como o abaixo:


<g:form action="updateCotacoes">

<table>

<g:each in="${cotacoes}" var="cotacao">

<tr>

<td>${cotacao.nome}</td>

<td><input type="text" name="valor" value="${cotacao.valor}"/></td>

<input type="hidden" name="id" value="${cotacao.id}"/>

</tr>

</g:each>

</table>

<input type="submit" value="Editar em massa!"/>

</g:form>

Como pode ser visto, neste formulario os campos valor e id irão ser repetidos n vezes, aonde n representa o número de cotações presentes na lista que enviamos para a camada de visualização. Como tratar desta situação no controlador?

É muito fácil. Quando trabalha com parametros com nomes repetidos, para obter a lista dos valores na ordem em que eles são expostos na página, basta usar a função list do objeto params usando como parametro o nome da variável com a qual queremos trabalhar, na action abaixo você pode ver como é simples.


def updateCotacoes = {

def ids = params.list('id')
def valores = params.list('valor')

for (i in 0..(ids.size() - 1)) {

def cotacao = Cotacao.get(ids[i])

cotacao.valor = valores[i]

cotacao.save()

}

}

Sim, é uma action bem feia, mas ilustra bem o recurso. :D

One thought on “Dica Grails: parâmetros com nomes duplicados

Leave a Reply

Your email address will not be published. Required fields are marked *