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
Pingback: Twitted by hodrigohamalho