Coleção de objetos fica nula a cada execução de closure
11/12/2008 00:00
0
Olá a todos, sou novato em Groovy/Grails e estou gostando bastante de mexer com isto <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->, mas estou com um probleminha.. <!-- s:( --><img src="{SMILIES_PATH}/icon_sad.gif" alt=":(" title="Sad" /><!-- s:( -->

Tenho duas classes, Processo e TermoGuarda, um Processo pode ter vários Termos Guarda e um TermoGuarda pode ter um Processo. Na página de cadastro do processo, eu tenho uma caixa de busca feita em ajax com prototype que retorna uma lista de termos de guarda (até aí blz), e pra cada registro há um link pra adicionar este termo de guarda ao processo e depois de adicionado eu posso remove-lo se quiser. O problema é que ele insere apenas o primeiro registro, pois a cada execução da closuse addTg (da classe ProcessoController), processoInstance fica nula, e não era pra ser, mas pelo jeito tem alguma coisa de errado. Já tentei de várias maneiras. Creio que deve ter uma forma melhor de se fazer isto, ficou meio com um monte de arquivos gsp pra fazer uma coisa simples. Me baseei neste artigo: <!-- m --><a class="postlink" href="http://www.devmedia.com.br/articles/viewcomp.asp?comp=2513">http://www.devmedia.com.br/articles/vie ... ?comp=2513</a><!-- m -->

Aqui está o código:

Processo.groovy

class Processo &#123;
Long id
...
static hasMany = [ termosGuarda&#58; TermoGuarda, veiculos&#58; Veiculo,
intimacoes&#58; Intimacao ]
&#125;


TermoGuarda.groovy

class TermoGuarda &#123;
Long id
String codigo

static belongsTo = Processo
&#125;


ProcessoController.groovy

class ProcessoController &#123;

def processoInstance = new Processo()

def addTg = &#123;
def tg = TermoGuarda.get(params.id)
if (tg)
processoInstance.addToTermosGuarda(tg)
&#125;
&#125;
&#125;


TermoGuardaController.groovy

class TermoGuardaController &#123;
def result = &#123;
return [ tgs&#58; TermoGuarda.findAllByCodigoLike(&quot;%&quot;+params.codigo+&quot;%&quot;) ]
&#125;
&#125;


/processo/create.gsp

<g&#58;render template=&quot;/termoGuarda/search&quot;/>


/termoGuarda/_search.gsp

<g&#58;formRemote name=&quot;ajaxForm&quot;
url=&quot;[controller&#58; 'termoGuarda', action&#58; 'result']&quot;
update=&quot;[success&#58;'message_search',failure&#58;'error_search']&quot;>

<input type=&quot;text&quot; name=&quot;codigo&quot; value=&quot;$&#123;termoGuarda?.codigo&#125;&quot;/>

<input type=&quot;submit&quot; value=&quot;Busca&quot;/>

</g&#58;formRemote>

<div id=&quot;message_search&quot;></div>
<div id=&quot;error_search&quot;></div>


/termoGuarda/result.gsp

<table>
<tr>
<th>Id</th>
<th>Codigo</th>
</tr>

<g&#58;each in=&quot;$&#123;tgs&#125;&quot;>
<tr>
<td>$&#123;it.id&#125;</td>
<td>$&#123;it.codigo&#125;</td>

<td class=&quot;actionButtons&quot;>
<g&#58;remoteLink controller=&quot;processo&quot; action=&quot;addTg&quot; id=&quot;$&#123;it.id&#125;&quot;
update=&quot;[success&#58;'message_row',failure&#58;'error_row']&quot;>
Adicionar</g&#58;remoteLink>
</td>
</tr>
</g&#58;each>

</table>

<div id=&quot;message_row&quot;></div>
<div id=&quot;error_row&quot;></div>


/processo/addTg.gsp

<div id=&quot;message&quot;></div>
<div id=&quot;error&quot;></div>

<table>
<tr>
<th>Id</th>
<th>Codigo</th>
</tr>

<g&#58;each in=&quot;$&#123;processoInstance?.termosGuarda&#125;&quot;>
<tr>
<td>$&#123;it.id&#125;</td>
<td>$&#123;it.codigo&#125;</td>

<td class=&quot;actionButtons&quot;>
<g&#58;remoteLink controller=&quot;processo&quot; action=&quot;removeTg&quot; id=&quot;$&#123;it.id&#125;&quot;
update=&quot;[success&#58;'message',failure&#58;'error']&quot;>
remover</g&#58;remoteLink>
</td>
</tr>
</g&#58;each>
</table>
Tags: Grails


0
Fiz uma coisa que deu certo, joguei numa session o objeto processoInstance, não sei se o código que eu fiz está da melhor forma possível..

ProcessoController.groovy

Processo processoInstance

def addTg = &#123;

// busca na sessao o objeto processoInstance
processoInstance = session['processoInstance']

if (processoInstance == null) &#123;
processoInstance = new Processo()
&#125;

def tg = TermoGuarda.get(params.id)
if (tg)
processoInstance.addToTermosGuarda(tg)

session['processoInstance'] = processoInstance
&#125;
12/12/2008 00:00


0
E ae, blz?

Segundo a referência do Grails ( <!-- m --><a class="postlink" href="http://grails.org/doc/1.0.x/index.html">http://grails.org/doc/1.0.x/index.html</a><!-- m --> ), item 6. The Web Layer, uma nova instância do Controller é criada para cada requisição.

Provavelmente por isso, apenas o primeiro registro era inserido.


Abraço
18/12/2008 00:00


0
[quote=&quot;Rafael Abe&quot;]E ae, blz?

Segundo a referência do Grails ( <!-- m --><a class="postlink" href="http://grails.org/doc/1.0.x/index.html">http://grails.org/doc/1.0.x/index.html</a><!-- m --> ), item 6. The Web Layer, uma nova instância do Controller é criada para cada requisição.

Provavelmente por isso, apenas o primeiro registro era inserido.


Abraço[/quote]

Foi o que percebi logo depois, até esqueci de postar aqui antes.

Coloquei a lista de termos de guarda numa session, e na hora de salvar eu a atribuia ao objeto processo.
19/12/2008 00:00



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