# AJAX + form con interazioni multiple

**URL:** <https://www.ruby-forum.com/t/ajax-form-con-interazioni-multiple/87713>\
**Category:** IT\
**Created:** [March 5, 2007, 2:02pm UTC](https://www.ruby-forum.com/t/ajax-form-con-interazioni-multiple/87713 "2007-03-05T14:02:31Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![carminem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/90db22/32.png) [@carminem](https://www.ruby-forum.com/u/carminem)\
**Post date:** [March 5, 2007, 2:02pm UTC](https://www.ruby-forum.com/t/ajax-form-con-interazioni-multiple/87713/1 "2007-03-05T14:02:31Z")

</div>

Salve a tutti,

Mi scuso per l’oggetto poco chiaro ma, al momento, non ho saputo trovare  
di meglio.

Inizio descrivendo dapprima ciÃ² che vorrei ottenere.

1. All’utente viene mostrato una richiesta di nr badge (non c’Ã¨ un  
modello associato)
2. Successivamente, viene mostrato un form chiedendo di inserire altri  
dati  
2.1 In questo form, viene data la possibilitÃ all’utente di aggiungere  
un titolare (obbligatorio per il modello legato al form) della  
transazione

Il form di cui al punto 2, Ã¨ legato ad un modello denominato “Trace”.  
Questo modello, ha una serie di validate\_presence\_of tra le quali spicca  
anche una sul “titolare” della transazione.  
CiÃ² implica che non posso salvare la transazione se, tra le altre cose,  
non  
Ã¨ stato associato un titolare alla stessa.

L’azione che viene invocata si chiama “ingresso\_uscita” ed Ã¨ definita  
come segue:

def ingresso\_uscita  
@trace = params[:traccia].blank? ? nil : Trace.new(params[:traccia])  
if request.xhr?  
if !params[:badge].blank?  
@trace = Trace.find\_by\_badge(params[:badge])  
if @trace.nil?  
@trace = Trace.new  
@trace.inizio = Time.now  
@trace.badge = params[:badge]  
@clienti = Client.find\_by\_sql(‘select \* from clients where id  
not in (select client\_id from traces where fine is null)’)  
end  
else  
@trace.client\_id = params[:id]  
@trace.nr\_abbinati = 1  
end  
render :update do |page|  
page.visual\_effect :highlight, ‘ingresso\_uscita\_form’  
page.replace\_html ‘ingresso\_uscita\_form’, :partial =\>  
‘form\_ingressouscita’  
end  
end  
end

La prima volta che viene chiamata, viene mostrato il form di cui al  
punto 1.  
Inserito il nr badge, alla conferma, l’azione viene richiamata e crea  
un’istanza che finisce nella variabile @trace.

A questo punto, quando l’utente clicca sul link generato da:

\<%= link\_to\_remote(“Titolare”, :url =\> { :controller =\> “main”, :action  
=\> “ingresso\_uscita”, :id =\> cliente.id }) %\>

CiÃ² che vorrei avvenisse Ã¨ che, tramite XHR, la richiesta giungesse  
all’azione  
“ingresso\_uscita”, ed il titolare selezionato venisse aggiunto  
all’istanza  
memorizzata in @trace.

CiÃ², purtroppo, non avviene perchÃ¨ tra due successive chiamate di  
“ingresso\_uscita”, l’istanza memorizzata in @trace svanisce.

Ho provato a serializzarne gli attributi e passarli come parametro  
tramite  
link\_to\_remote ma solo params[:id] figura tra i parametri.

Come faccio?

Ringrazio in anticipo per il Vs aiuto

---

<div class="post-metadata">

**Author:** ![carminem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/90db22/32.png) [@carminem](https://www.ruby-forum.com/u/carminem)\
**Post date:** [March 5, 2007, 2:25pm UTC](https://www.ruby-forum.com/t/ajax-form-con-interazioni-multiple/87713/2 "2007-03-05T14:25:34Z")

</div>

Carmine M. wrote:

> Salve a tutti,  
> pur non avendo capito bene cosa succedee prima…

> CiÃ² che vorrei avvenisse Ã¨ che, tramite XHR, la richiesta giungesse  
> all’azione  
> “ingresso\_uscita”, ed il titolare selezionato venisse aggiunto  
> all’istanza  
> memorizzata in @trace.  
> eh si perche ogni richiesta e’ servita da una nuova istanza del  
> controller!

> CiÃ², purtroppo, non avviene perchÃ¨ tra due successive chiamate di  
> “ingresso\_uscita”, l’istanza memorizzata in @trace svanisce.

evitando di memorizzare in sessione il @trace (da quello che posso  
intuire non puoi identificare l’utente con la sessione di browser…)  
non ti rimane che passare il trace.id come parametro e rileggere dal db  
il Trace alla seconda richiesta.

ciao,  
Luca

> * * *
> 
> * * *
> 
> Ml mailing list  
> removed\_email\_address@domain.invalid  
> [http://lists.ruby-it.org/mailman/listinfo/ml](http://lists.ruby-it.org/mailman/listinfo/ml)

–

Web: [http://spazidigitali.com](http://spazidigitali.com) - [http://thetyper.com](http://thetyper.com)  
Email mailto://removed\_email\_address@domain.invalid  
Skype callto://l.mearelli

---

<div class="post-metadata">

**Author:** ![carminem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/90db22/32.png) [@carminem](https://www.ruby-forum.com/u/carminem)\
**Post date:** [March 5, 2007, 2:31pm UTC](https://www.ruby-forum.com/t/ajax-form-con-interazioni-multiple/87713/3 "2007-03-05T14:31:24Z")

</div>

Luca M. wrote:  
[…@trace svanisce tra 2 chiamate…]

> eh si perche ogni richiesta e’ servita da una nuova istanza del  
> controller!

Immaginavo

> > CiÃ², purtroppo, non avviene perchÃ¨ tra due successive chiamate di  
> > “ingresso\_uscita”, l’istanza memorizzata in @trace svanisce.
> 
> evitando di memorizzare in sessione il @trace (da quello che posso  
> intuire non puoi identificare l’utente con la sessione di browser…)  
> non ti rimane che passare il trace.id come parametro e rileggere dal db  
> il Trace alla seconda richiesta.

Purtroppo questo non posso farlo, a meno di rimuovere il  
validate\_presence\_of sul campo titolare.  
Infatti, non posso persistere l’istanza di Trace se manca il titolare.

---

<div class="post-metadata">

**Author:** ![carminem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/90db22/32.png) [@carminem](https://www.ruby-forum.com/u/carminem)\
**Post date:** [March 5, 2007, 3:15pm UTC](https://www.ruby-forum.com/t/ajax-form-con-interazioni-multiple/87713/4 "2007-03-05T15:15:40Z")

</div>

Luca M. wrote:

> Carmine M. wrote:
> 
> > > > CiÃ², purtroppo, non avviene perchÃ¨ tra due successive chiamate di  
> > > > validate\_presence\_of sul campo titolare.  
> > > > Infatti, non posso persistere l’istanza di Trace se manca il titolare.
> 
> mi pareva di non aver capito il flusso, ma… hai veramente bisogno di  
> tornare al database per completare l’inserimento del Trace? Non lo puoi  
> fare in un solo passo?

Non ho necessitÃ di tornare al DB ed Ã¨ mia intenzione fare tutto in un  
solo passo.

Pensavo di far vedere all’utente una griglia dalla quale poter scegliere  
il  
titolare della transazione.  
Tale scelta volevo comunicarla tramite AJAX al controller.

Se hai presente il libro “Agile Web D. with Rails”, c’Ã¨ un  
esempio  
che realizza una ToDo list tramite AJAX.  
Nell’esempio l’aggiunta e la rimozione degli item viene notificata al  
controller per mezzo di AJAX.

Sostanzialmente, io devo fare la stessa cosa. L’unica differenza Ã¨ che,  
nell’esempio del libro, l’oggetto proprietario dei vari “todo” Ã¨ giÃ  
memorizzato nel DB.  
Nel mio caso, l’oggetto Ã¨ ancora da memorizzare.

Tuttavia, forse sarebbe meglio se il flusso venisse modificato in  
maniera tale che vengano prima definiti numero badge e titolare e, poi,  
il completamento  
delle informazioni mancanti.

> Altra possiblita e’ memorizzare in campi nascosti della form i dati che  
> hai ricavato al primo giro e ricreare il Trace: un po tutte le  
> applicazioni rails fanno questo quando creano un nuovo oggetto dal  
> modello nella azione new e poi lo ricreano nell’azione create (anche  
> quando queste due sono una sola azione).

A questa non ci avevo pensato 🙂

> Oppure condizioni l’esecuzione della validaizone di presenza al valore  
> di un altro campo…
> 
> validate\_presence\_of :titolare :if=\>:controlla\_titolare
> 
> def controlla\_titolare  
> self.altro\_attributo == ‘OK’  
> end

Temo non sia possibile perchÃ¨, i pochi campi che fanno parte del  
modello, sono  
tutti tranne 3 compilati in automatico. Tra quelli non compilati in  
automatico  
c’Ã¨ il titolare. Gli altri 2 sono slegati da quest ultimo.

---

<div class="post-metadata">

**Author:** ![carminem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/90db22/32.png) [@carminem](https://www.ruby-forum.com/u/carminem)\
**Post date:** [March 5, 2007, 4:55pm UTC](https://www.ruby-forum.com/t/ajax-form-con-interazioni-multiple/87713/5 "2007-03-05T16:55:48Z")

</div>

Ciao Luca,

Ti ringrazio infinitamente per il tuo aiuto.  
Sono riuscito a risolvere in maniera molto semplice, ricorrendo alla  
session[].  
Ho memorizzato l’istanza di Trace nella session[] tra le varie chiamate.

🙂

A buon rendere

---

<div class="post-metadata">

**Author:** ![carminem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/90db22/32.png) [@carminem](https://www.ruby-forum.com/u/carminem)\
**Post date:** [March 5, 2007, 2:45pm UTC](https://www.ruby-forum.com/t/ajax-form-con-interazioni-multiple/87713/6 "2007-03-05T14:45:37Z")

</div>

Carmine M. wrote:

> > > CiÃ², purtroppo, non avviene perchÃ¨ tra due successive chiamate di  
> > > validate\_presence\_of sul campo titolare.  
> > > Infatti, non posso persistere l’istanza di Trace se manca il titolare.

mi pareva di non aver capito il flusso, ma… hai veramente bisogno di  
tornare al database per completare l’inserimento del Trace? Non lo puoi  
fare in un solo passo?

Altra possiblita e’ memorizzare in campi nascosti della form i dati che  
hai ricavato al primo giro e ricreare il Trace: un po tutte le  
applicazioni rails fanno questo quando creano un nuovo oggetto dal  
modello nella azione new e poi lo ricreano nell’azione create (anche  
quando queste due sono una sola azione).

Oppure condizioni l’esecuzione della validaizone di presenza al valore  
di un altro campo…

validate\_presence\_of :titolare :if=\>:controlla\_titolare

def controlla\_titolare  
self.altro\_attributo == ‘OK’  
end

Luca

> * * *
> 
> * * *
> 
> Ml mailing list  
> removed\_email\_address@domain.invalid  
> [http://lists.ruby-it.org/mailman/listinfo/ml](http://lists.ruby-it.org/mailman/listinfo/ml)

–

Web: [http://spazidigitali.com](http://spazidigitali.com) - [http://thetyper.com](http://thetyper.com)  
Email mailto://removed\_email\_address@domain.invalid  
Skype callto://l.mearelli
