Salve a tutti,
Riprendo, in parte, un argomento per cui ho già chiesto lumi qualche
giorno fa.
Inizio esponendo quella che è la mia necessità ed, in un secondo
momento, illustrerò
la strada da me seguita e che, sebbene abbia prodotto qualcosa
all’apparenza soddisfacente,
mi lascia con qualche (magari ) perplessità .
Ho un form nel quale raccolgo alcuni dati:
- Nr badge
- accompagnatore
- tipo documento
- nr documento
- inizio
- fine
- nr abbinati
- titolare
- costo (default 0.0)
Ad eccezione di “fine”, sono tutti campi obbligatori.
Il flusso di lavoro è il seguente:
- Viene chiesto il nr badge
1.1 se non esistono movimenti con “fine is null” abbinati al badge,
viene creata una
nuova istanza del modello “Trace” (quello preposto alla gestione dei
dati di cui sopra)
1.2 se esiste un movimento con “fine is null” abbinati al badge, viene
recuperato il record e
ricreata l’istanza che lo ha generato.
2 Viene mostrato il form per la raccolta degli altri dati
2.1 Se l’unico campo da compilare rimasto è “fine”, alla conferma
(submit) viene calcolato
il costo della transazione, e viene offerta la possibilitÃ
all’utente di, evnetualmente,
variare il costo proposto.
Nel form per la raccolta dei dati, ad un certo punto, viene mostrato un
elenco dei possibili
titolari della transazione.
Selezionando il titolare, l’elenco viene sostituito con un riquadro che
fornisce un dettaglio
delle informazioni per il titolare selezionato.
Dove nasce il problema?
Una sola parola: AJAX.
Nello specifico, relativamente alla selezione del titolare della
transazione.
Quello a cui sono pervenuto ha soddisfatto tutti i requisiti, eccezion
fatta per la possibilitÃ
di variare il costo proposto per la transazione.
Il codice dell’action è il seguente, ed è il motivo delle mie
perplessità :
def ingresso_uscita
if request.xhr?
if !params[:badge].blank?
@trace = Trace.find_by_badge(params[:badge], :conditions => [‘fine
is null’])
if @trace.nil?
# Nuovo ingresso
@trace = Trace.new
@trace.badge = params[:badge]
@trace.inizio = Time.now
@trace.fine = nil
@trace.feriale = false
@trace.client_id = nil
@clienti = Client.find_by_sql(‘select * from clients where id
not in (select client_id from traces where fine is null)’)
session[:traccia] = @trace
else
# Definiamo l’uscita
@trace.fine = Time.now
@trace.save!
@cliente = Client.find(@trace.client_id)
session[:traccia] = @trace
end
else
# Abbiamo già cominciato ad inserire i dati
old = session[:traccia]
if params[:trace].blank?
@trace = old
else
@trace = Trace.new(params[:trace])
@trace.badge = old.badge
@trace.inizio = old.inizio
@trace.fine = old.fine
if params[:id].blank?
@trace.client_id = old.client_id
else
@trace.client_id = params[:id]
end
if !@trace.client_id.nil?
@cliente = Client.find(@trace.client_id)
@trace.nr_abbinati = 1 if @trace.nr_abbinati < 1
end
end
session[:traccia] = @trace
end
end
if @trace
begin
@trace.save! if @trace.valid?
parziale = !@trace.fine.nil? ? ‘transazione_confermata’ :
‘form_ingressouscita’
rescue Exception => e
@parametri = params
parziale = ‘errore’
raise e
end
render :update do |page|
page.replace_html 'ingresso_uscita_form', :partial => parziale
end
end
end
Come potete vedere, è un Ces… pò incasinato.
E’ vero che si tratta di una prima stesura però.
A questo punto, avete qualche suggerimento da darmi? (no, l’ippica no
please )
Ringrazio in anticipo per il Vs aiuto