Ruby on Rails
HowtoConfigurazioniPersonalizzate

Rhahn in IRC domandava come settare un valore configurabile per la sua applicazione.
Dopo aver preso in considerazione l’ipotesi di utlizzare un file separato (possibilmente utilizzando YAML), gli fu riferito che Rails dispone già di files di configurazione che possono esser utilizzati.

Questa pagina analizza tre differenti approcci per memorizzare dati di configurazione:

  1. Utilizzare uno dei files di configurazione di Rails
  2. Utilizzare un proprio file (scritto in YAML o Ruby)
  3. Utilizzare un database
  4. Utilizzare un generatore di configurazioni

1. Utilizzare uno dei files di configurazione di Rails

Rails utilizza alcuni files di configurazione.
Questi files possono essere utilizzati per impostare costanti e controllare la configurazione delle vostre applicazioni.
I dettagli di configurazione son divisi in un file che è condiviso fra i differenti setup, e dei files individuali che son specifici per ogni differente setup dell’applicazione. (Per esempio: development, test, production).

Si veda EnvironmentFiles per maggiori informazioni a riguardo di questi files.

Nel file di configurazione le impostazioni vanno inserite in questo modo:


IMAGES_PATH = “/foo/man/chu/”

…è presto fatto! Le tue impostazioni di configurazione sono presenti ovunque ci sia Rails!

Versioni

Rails 0.9 e successivi

Le impostazioni condivise vanno in config/environment.rb. Le impostazioni non condivise vanno negli appropriati files nella cartella config/environments/, p.e. config/environments/development.rb.

>> Questo non funziona. Ho aggiunto una variabile chiamata $MYVAR in config/environments/development.rb e quando tento di accedervi in qualsiasi modello o controllo, mi viene detto che MYVAR è nil.
>> Hai riavviato WEBrick/Apache dopo aver aggiunto l’impostazione, come descritto sotto? That’s what caught me out… also, you need to consistently use MYVAR without the $ sign.

Rails 0.8.5

Se la configurazione è la stessa fra test e production, è possibile utilizzare config/environments/shared.rb. Se invece si rende necessario differenziare i due tipi di configurazione, sarà necessario aggiungere le impostazioni in `test.rb` e `production.rb`.

Accesso

Come puoi accedere agli oggetti impostati? Non esiste un oggetto “config” (finchè non se ne crea uno). Un metodo è quello di assegnare le impostazioni di configurazione in environment.rb, le quali saranno raggiungibili da qualsiasi punto dell’applicazione Rails.

Per accedere alle ‘costanti’ nella applicazione Rails, si utilizza (in un layout .rhtml per esempio):

<title>RailsTest: <%= NOME_DEL_SITO %></title>

Riavviare per ricaricare

Per ricaricare i cambiamenti effettuati sul file ‘environment.rb’ è necessario riavviare il server WEBrick o Apache.

2. Utilizzare un proprio file

YAML

Scrivere la configurazione in un file separato, per esempio myconfig.yml

Dopo di che si può fare facilmente il parsing del file e accedere alla propria configurazione


myconfig = YAML.load(File.open(“#{RAILS_ROOT}/config/myconfig.yml”))

Esiste anche un ConfigurationGenerator per generare un sistema di configurazione YAML-based.

Un’altro file Ruby

E’ possibile scrivere le proprie costanti di configurazione in un file Ruby. Il file va incluso dove servono le impostazioni.
Per esempio questo è il mio file config/email.conf.rb


#
# Email configuration
#
$SMTP_ADDRESS        = "smtp.mac.com"
$SMTP_PORT        = 25
$SMTP_DOMAIN        = "mail.mac.com"
$SMTP_USER_NAME        = "johnatl"
$SMTP_USER_PASSWORD    = "secret"

Ho dovuto utilizzare require piuttosto che include.

Credo che la terminologia appropriata per i valori che usano $ sia “variabile globale”, e non “costante”.

3. Utilizzare un database

Create una tabella nel vostro database (p.e. *preferences*) a tre colonne, id@, setting, e value. Generate un modello per la tabella come al solito. Dove avete necessità di accedere alle preferenze, semplicemente utilizzate require 'preference'. Il file del modello preference è cosi strutturato:


# Fornisce l'accesso globale tramite metodo get_setting
def get_setting(setting)
  return Preference.get_setting(setting)
end

class Preference < ActiveRecord::Base

  def Preference.get_setting(setting)
    result = Preference.find_by_setting( setting )
    if not result.nil?
      return result["value"]
    end
    return nil
  end

end

_get_setting va nell ApplicationController, non è vero? —Rad Smith_

Veramente, dovrebbe andare nell’ApplicationHelper, strettamente parlando… spesso si ha la necessita di accedere alla configurazione dalle viste (per esempio "NOMEDEL_SITO" — Anonymous_

4. Utilizzare un generatore di configurazioni

Si puo anche utilizzare un generatore di configurazioni (Generators?), il quale salva le impostazioni nel database, e scrive uno YAML ogni volta che queste vengono modificate.
E’ possibile creare una configurazione diversa per ogni controller, e caricar il rispettivo YAML nel controller corrispondente.

>> Traduzione di Paolo Sangregorio