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