Rails: variabili globali troppo globali


#1

Buongiorno lista.
Ho fatto un’applicazione in rails usata in contemporanea da più persone
ed avrei la necessità di tenere dei dati in memoria, praticamente
all’inizio l’operatore sceglie da un menù a tendina una opzione e deve
portarsela dietro per un po’, naturalmente se il valore è memorizzato in
@valore non posso trascinarmelo dietro per il programma, mentre se lo
salvo in $valore mi rimane sì per tutta l’applicazione, ma diventa una
variabile globale anche per gli altri operatori, cosa alquanto
sgradevole. Gli utenti entrano tramite nome e password, uso Restful
Authentication; c’è un sistema decente o devo aggiungere dei campi alla
tabella users in cui memoriccare le variabili per singolo utente?


#2

On Mon, Mar 2, 2009 at 11:55 AM, Daneel O.
removed_email_address@domain.invalid wrote:

Ho fatto un’applicazione in rails usata in contemporanea da più persone
ed avrei la necessità di tenere dei dati in memoria

visto il caso d’uso che racconti direi che il modo ideale per
memorizzare quel dato e’ la sessione (soprattutto visto che il dato da
memorizzare e’ piccolo e.g. l’id di un oggetto, una stringa, …)

ciao,
Luca


#3

2009/3/2 Daneel O. removed_email_address@domain.invalid:

tabella users in cui memoriccare le variabili per singolo utente?
potresti usare session:

session[:something] = somevalue

però la session di default, cookie session store, ha capacità
limitate; prova, se non ti va bene puoi provare a decommentare

config.action_controller.session_store = :active_record_store

dentro config/environments.rb, però non ho mai provato, non so come
funziona.

pietro


#4

Io lo uso quasi sempre, in pratica genera una tabella nuova e ci salva
dentro i dati della session, molto comodo e molto veloce (e sopratutto
ti puoi portare dietro grossi moli di dati)

config.action_controller.session_store = :active_record_store

dentro config/environments.rb, per� non ho mai provato, non so come
funziona.


#5

Intervento da niubbo…

perche’ non si usa in questo caso:

flash[:foo] = bar ?

ciao

Il giorno 03/mar/09, alle ore 19:31, Paolo M. ha scritto:


#6

Alessandro S. wrote:

Io lo uso quasi sempre, in pratica genera una tabella nuova e ci salva
dentro i dati della session, molto comodo e molto veloce (e sopratutto
ti puoi portare dietro grossi moli di dati)

config.action_controller.session_store = :active_record_store

dentro config/environments.rb, per� non ho mai provato, non so come
funziona.

Attenzione però alle race conditions tra chiamate diverse dello stesso
browser. Sono comuni quando ci sono applicazioni ajax che vanno a
cambiare dati in sessione e se non si sa che possono capitare si
impazzisce per giorni a cercare misteriosi bug che fanno sparire i dati
appena memorizzati in session[].

In due parole: la chiamata ajax 1 inizia a fare operazione e a scrivere
dati in sessione, la chiamata ajax 2 inizia anche lei a lavorare e
finisce prima della 1; quando la 1 finisce va a memorizzare la sua
sessione sovrascrivendo qualsiasi cosa la 2 abbia fatto.

Per rimediare al problema esiste una variante di active_record_store che
si chiama SmartSessionStore. La uso da un paio d’anni con soddisfazione
anche se ricordo di averla customizzata un po’ (ma non il perché)

http://svn1.hosted-projects.com/fcheung/smart_session_store/trunk/

Meglio ancora è evitare di usare la sessione se non per dati molto
piccoli e in situazioni che non abbiano race conditions. Solo che
all’inizio della mia esperienza in Rails venivo da Java dove in sessione
si infila di tutto. Ora non lo faccio più :slight_smile:

Paolo