Variabili da richiamare in tutti i controller

Salve a tutti,
vorrei definire delle variabili da richiamare all’occorrenza in tutti i
controller.
Come si fa?

Ho provato a definirle in application.rb e application_helper.rb ma non
funge, penso di sbagliare la sintassi.

Grazie

Il 17 dicembre 2009 19.45, Luigi M. [email protected] ha
scritto:

Salve a tutti,
vorrei definire delle variabili da richiamare all’occorrenza in tutti i
controller.
Come si fa?

Ho provato a definirle in application.rb e application_helper.rb ma non
funge, penso di sbagliare la sintassi.

ciao,
che genere di variabili? puoi spiegarci qualcosa in
più?
Ad esempio, quanto devono vivere: per sempre, per una sessione, per
l’arco di una request/response?

Cosa devono contenere? Oggetti a/r, altri oggetti, stringhe…

pietro

Devono valere per l’applicazione, quindi sempre e mi servono per
definire una sola volta in un solo punto dell’applicazioni il numero di
articoli da visualizzare, ad esempio.

Quindi nel controller view vorrei poter richiamare la variabile:

@num_articoli=14

da utilizzare anche in altri controller.

Grazie mille

Il 17 dicembre 2009 20.20, Luigi M. [email protected] ha
scritto:

Devono valere per l’applicazione, quindi sempre e mi servono per
definire una sola volta in un solo punto dell’applicazioni il numero di
articoli da visualizzare, ad esempio.

Quindi nel controller view vorrei poter richiamare la variabile:

@num_articoli=14

da utilizzare anche in altri controller.

Ciao,

Non è possibile usare semplicemente una variabile che valga tra una
request e l’altra: un’applicazione web “vive” solamente nell’arco di
un singolo ciclo di richiesta/risposta.

Ci sono principalmente due modi per ottenere la persistenza dei dati:
cookie e db.

usando i cookie, ad esempio tramite la session:

session[:num_articoli] = 14

In questo modo la variabile è specifica per ogni sessione, cioè per
ogni utente e per ogni browser.

Se però vuoi che la variabile sia unica per tutta l’applicazione,
oppure per ogni utente ma con tutti i browser, devi ricorrere al db
(potresti anche usare un file, ma ne avresti solo problemi).

In base a chi deve condividere la variabile, puoi aggiungere un campo
ad una tabella (ad esempio utenti, o profili, o altro) e farlo gestire
normalmente al model relativo.

So che sono molto vago, ma se ci dai altri dettagli, provo a essere
più specifico.

pietro

Ho capito perfettamente,
veramente era una tecnica che avevo già implementato, l’uso del db, però
non so, preferivo o cmq volevo sapere se era possibile fare in
quest’altro modo.

Grazie mille per il tempo dedicatomi.

Il 18 dicembre 2009 09.19, Marco M.
[email protected] ha scritto:

Io in genere uso delle costanti globali

sì, spesso è la cosa migliore, però mi sembra di aver capito che lui
vuole poterle modificare…

pietro

Grazie Marco,
è proprio quello che mi serviva.

A questo punto però vorrei approfondire l’altro discorso quello dell’uso
del DB che risulta più versatile per la modifica dei parametri senza
l’upload del file config.rb, come suggeriva Marco.

Ho creato nel DB la tabella Settings, all’interno della quale mi genero
i campi che servono.

Ora tali campi mi serve utilizzarli in più viste dello stesso
controller.

Mettiamo il caso che mi servano nelle due viste index e view, la
procedura corretta ma poco elegante sarebbe quella di scrivere:

def index

@settings=Settings.find(:all)
end

def view

@settings=Settings.find(:all)
end

è poco elegante perché se utilizzo i settings in 20 viste o cmq in tutte
le viste del singolo controller devo scrivere 20 volte la stessa cosa.

C’è un modo per raccogliere i dati da DB una sola volta e renderli
disponibili a tutte le viste?

Grazie mille

Luigi M. wrote:

Ho capito perfettamente,
veramente era una tecnica che avevo già implementato, l’uso del db, però
non so, preferivo o cmq volevo sapere se era possibile fare in
quest’altro modo.

Grazie mille per il tempo dedicatomi.

Io in genere uso delle costanti globali che forse possono fare al caso
tuo. Basta metterle in qualsiasi file dentro la cartella
config\initializers, io preferisco creare un file dedicato:

#config\initializers\config.rb

NUM_ARTICOLI=14

sarà visibile in ogni posto: in tutti i controller, in tutte le viste
ecc.

Ti ringrazio Luca,
però preferirei non usare plugin per un’operazione relativamente
semplice.

Pietro mi sai aiutare tu?

2009/12/17 Pietro G. [email protected]:

Il 17 dicembre 2009 20.20, Luigi M. [email protected] ha scritto:

Devono valere per l’applicazione, quindi sempre e mi servono per
definire una sola volta in un solo punto dell’applicazioni il numero di
articoli da visualizzare, ad esempio.

Se però vuoi che la variabile sia unica per tutta l’applicazione,
oppure per ogni utente ma con tutti i browser, devi ricorrere al db
(potresti anche usare un file, ma ne avresti solo problemi).

Per i dati “statici” (ovvero unici per tutta l’applicazione e che non
variano durante il suo funzionamento) io uso con soddisfazione il
plugin AppConfig:

ti permette di definire i valori in un file yml che puo essere
generale ma con override specifici per ciascun RAILS_ENV, quindi darti
valori diversi per production, development e test)

per esempio se hai in base.yml:

num_articoli: 20

in applicazione puoi usare AppConfig.num_articoli

inoltre i dati possono essere raggruppati per dar loro un po’ di
organizzazione:

record_visualizzati:
prodotti: 20
utenti: 50

avrai:
AppConfig.record_visualizzati.prodotti == 20
AppConfig.record_visualizzati.utenti == 50

ciao,
Luca

Il 18 dicembre 2009 09.55, Luigi M. [email protected] ha
scritto:

Ti ringrazio Luca,
però preferirei non usare plugin per un’operazione relativamente
semplice.

Pietro mi sai aiutare tu?

ricominciamo da capo: questi dati sono costanti o possono essere
assegnati durante l’esecuzione?

Se sono fissi, usa la configurazione di rails, un file yaml o un
plugin, una costante, insomma, hai l’imbarazzo della scelta.

Se devono variare, usa il db.

Da quello che ho capito io devono variare, quindi provo a rispondere
per quello che ho capito.

C’è un modo per raccogliere i dati da DB una sola volta e renderli
disponibili a tutte le viste?

Ci sono due modi: il primo è definire un metodo in
application_controller.rb, esempio (attenzione: codice non testato):

app/controllers/application_controller.rb

se in questa request è già stato chiamato, curr_settings restituisce

il valore già ottenuto.

in caso contrario restituisce il primo record di Setting, creandolo

con valori di default se non esiste.
def curr_settings
@curr_settings ||= Setting.first
@curr_settings ||= Setting.create :num_articoli => ValoreDiDefault,

end

def num_articoli
@num_articoli ||= curr_settings.num_articoli
end

modifica sul db il valore di num_articoli

def num_articoli= nuovo_valore
cs = curr_settings
cs.num_articoli = nuovo_valore
cs.save
end

Così nei controller usi num_articoli come se fosse una comune variabile.
L’utilizzo di @num_articoli ||= … fa sì che quello che segue venga
eseguito solo se @num_articoli è nil o false.
Nota che nel mio esempio la tabella settings contiene al più un solo
record; in base a come deve comportarsi la tua applicazione, questo
può andare bene oppure no.

Un altro modo è definire dei metodi simili nel model, e lasciare che
sia questo a gestire tutto.

Potresti usare metodi statici e variabili di classe, così da poter
usare Setting.num_articoli in modo trasparente (attenzione: codice non
testato):

app/models/setting.rb

def self.curr_settings
@@curr_settings ||= first
@@curr_settings ||= create :num_articoli => ValoreDiDefault, …
end

def self.num_articoli
@@num_articoli ||= curr_settings.num_articoli
end

def self.num_articoli= nuovo_valore
cs = curr_settings
cs.num_articoli = nuovo_valore
cs.save
end

pietro

2009/12/18 Luigi M. [email protected]:

però preferirei non usare plugin per un’operazione relativamente
semplice.

allora il consiglio di Marco (costanti globali definite in un
initializer) e’ quello che fa al caso tuo :slight_smile:

Luca