[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