2010-04-19 19 views
12

Ich frage mich, ob es die Best Practice gibt, wo globale Einstellungen in einer Rails App gespeichert werden. Was ich damit meine ist: Ich habe ein paar Globals definiert, die sich ändern können, aber nicht wahrscheinlich und es scheint unpassend, sie in DB zu speichern, da sie so oft benutzt werden. Zum Beispiel habe ich SYSTEM_EMAIL & SYSTEM_EMAIL_SIGNATURE & SYSTEM_STORAGE_ROOT.Wo ist der beste Ort, um Globals in Rails App zu speichern?

Momentan behalte ich sie in environment.rb, aber ich bin mir nicht sicher, ob dies der richtige Ort ist, um sie zu speichern.

Danke

EDIT:

akzeptierte Antwort immer noch als angemessen steht, aber da zog ich auf https://github.com/markbates/configatron verwenden, gibt andere Optionen, aber Ich mag configatron am meisten.

Antwort

15

Eine meiner bevorzugten Techniken besteht darin, eine Datei mit den Konstanten in das Verzeichnis config/initializers/ zu legen (alle Dateien in diesem Verzeichnis werden automatisch geladen), aber mit einem Abschnitt für jede andere Rails-Umgebung. z.B.


case ENV['RAILS_ENV'] 
    when "development" 
    SYSTEM_EMAIL = ... 
    SYSTEM_EMAIL_SIGNATURE = ... 
    when "staging" 
    SYSTEM_EMAIL = ... 
    SYSTEM_EMAIL_SIGNATURE = ... 
    when "production" 
    SYSTEM_EMAIL = ... 
    SYSTEM_EMAIL_SIGNATURE = ... 
end 

Wenn Sie stattdessen die Konstanten alle in einem großen Hash zu laden, dann können Sie sie als eine YAML Datei laden. Erstellen Sie zwei Dateien, eine mit dem Namen config/initializers/email_constants.rb und die andere config/email_constants.yml. Im letzteren Put etwas wie:


development: 
    :system_email: ... 
    :system_email_signature: ... 
staging: 
    :system_email: ... 
    system_email_signature: ... 

... etc ... 

Dann in config/initializers/email_constants.rb put:


EMAIL_CONSTANTS = YAML.load_file("#{RAILS_ROOT}/config/email_constants.yml")[RAILS_ENV] 

Dies lädt die gesamte YAML-Datei und die Abtretungsempfänger der Wert des entsprechenden Schlüssel EMAIL_CONSTANTS (die die RAILS_ENV darstellt).

Der Vorteil dieser beiden Techniken ist die Lokalität. Sie können alle Konstanten, die miteinander in Beziehung stehen (z. B. E-Mail-Konstanten in diesem Fall), in einer Datei ablegen. Anstatt dieselben Konstanten auf drei verschiedene Dateien zu verteilen (eine für jede Rails-Umgebung), haben Sie sie alle in einer Datei.

+0

Danke Sean. Ich mag Sie nähern sich am meisten - außer ich glaube nicht, dass ich in emailconstants.yml trennen muss - ich werde nur alles in contacnts.yml behalten – konung

1

environment.rb ist der Ort. Sie können es zu einem Modul hinzufügen und es dem Verzeichnis lib hinzufügen. dann könnte man es als Module :: MY_GLOBAL_VARIABLE bezeichnen. Beide haben Stärken und Schwächen. In der environment.rb ist ok, aber manchmal sieht es chaotisch aus. Wenn alle diese globalen Variablen verwandt sind, können Sie sie dann in einem Modul gruppieren.

2

Rails 3 führt das Application-Objekt ein. Selbst mit Rails 2 möchten Sie vielleicht Ihre Globals auf ähnliche Weise speichern.

+0

Interessant, ich 3 vor kurzem Blick auf Rails gestartet - speziell Routen, aber habe nicht viel mehr gelesen. Ich werde mal schauen. Danke für den Zeiger Marc – konung

10

Da sich solche Werte oft abhängig von der Umgebung ändern, in der Sie gerade arbeiten, speichere ich Globals in config/environments/development.rb|production.rb|test.rb mit entsprechenden Werten für jede Umgebung.

+0

Wie wäre es mit Konstanten, die über dev/prod/test gleich sein sollten? Statt sie in allen dreien zu speichern, gibt es eine Datei, die für alle drei Umgebungen gilt? – LikeMaBell

+0

Die Antwort auf meinen eigenen Kommentar scheint /config/environment.rb zu sein. Jemand korrigiert mich bitte, wenn ich falsch liege. – LikeMaBell

+0

Yup, das ist es. – Ben

1

Ich speichere solche Konfigurationsinformationen in einer YML-Datei. Weitere Einzelheiten finden Sie unter screen-cast.

Alternativ können Sie ein Juwel namens app_config verwenden.

1

Normalerweise, wenn ich so etwas wie dies tue, ich habe zwei Möglichkeiten, dieses

1 tun - Wenn meine globalen Variablen die für alle drei Umgebungen (Entwicklung, Test, Produktion), dann werde ich es speichern in

config/environments.rb Datei

Aber läßt meine Werte sagen werden auf die Umwelt zu ändern

Ex: meine Entwicklungsumgebung SYSTEM_STORAGE_ROOT ist '/ development_root /' und Testumgebung SYSTEM_STOR AGE_ROOT ist '/ testing_root /'

dann werde ich speichern Sie sie in

config/Umgebungen/

Gemäß dem obigen Beispiel

config/Umgebungen/development.rb wird SYSTEM_STORAGE_ROOT haben = '/ development_root /'

config/Umgebungen/test.rb wird SYSTEM_STORAGE_ROOT haben = '/ testing_root /'

config/Umgebungen/production.rb wird SYSTEM_STORAGE_ROOT haben = '/ production_root /'

hoffe, das hilft,

prost, sameera

Verwandte Themen