AJAX + form con interazioni multiple


#1

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


#2

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

Web: http://spazidigitali.com - http://thetyper.com
Email mailto://removed_email_address@domain.invalid
Skype callto://l.mearelli


#3

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.


#4

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 :slight_smile:

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.


#5

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.

:slight_smile:

A buon rendere


#6

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

Web: http://spazidigitali.com - http://thetyper.com
Email mailto://removed_email_address@domain.invalid
Skype callto://l.mearelli