[ruby-it] Variabili da richiamare in tutti i controller
Pietro Giorgianni
giorgian a gmail.com
Ven 18 Dic 2009 10:31:43 CET
Il 18 dicembre 2009 09.55, Luigi Maresca <marluigi a libero.it> 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
More information about the Ml
mailing list