So definieren Sie benutzerdefinierte Konfigurationsvariablen in Schienen

337

Ich habe mich gefragt, wie man einer Rails-Anwendung benutzerdefinierte Konfigurationsvariablen hinzufügt und wie man im Controller darauf zugreift. Zum Beispiel möchte ich in den Konfigurationsdateien ein upload_directory definieren können, z. B. development.rb, und in einer meiner Dateien darauf zugreifen können Steuerungen.

Zweitens plante ich S3-Unterstützung für Uploads in meiner Anwendung, wenn ich eine Yaml-Datei mit dem s3-Zugriff, dem geheimen Schlüssel, hinzufügen wollte, wie ich sie in meiner Rails-App initialisiere und wie ich auf die von mir definierten Werte zugreife in dieser Konfigurationsdatei.

Shiv
quelle
1
Duplikat: stackoverflow.com/questions/592554/…
John Topley
Leicht verwandt: Vergessen Sie nicht, den Server neu zu starten, wenn Sie neue Konfigurationsvariablen hinzufügen.
Damien Ó Ceallaigh

Antworten:

165

Update 1

Sehr zu empfehlen: Ich gehe heutzutage mit Rails Config Gem für die feinkörnige Kontrolle, die es bietet.

Update2

Wenn Sie eine schnelle Lösung wünschen, überprüfen Sie die Antwort von Jack Pratt unten.

Obwohl meine ursprüngliche Antwort unten immer noch funktioniert, ist diese Antwort jetzt veraltet. Ich empfehle, die Updates 1 und 2 zu lesen.

Ursprüngliche Antwort:

Für eine schnelle Lösung sollte es sehr hilfreich sein, den Bildschirm "YAML-Konfigurationsdatei" von Ryan Bates anzusehen.

Zusammenfassend:

# config/initializers/load_config.rb
APP_CONFIG = YAML.load_file("#{Rails.root}/config/config.yml")[Rails.env]

# application.rb
if APP_CONFIG['perform_authentication']
  # Do stuff
end
khelll
quelle
62
Diese Antwort ist veraltet. Siehe stackoverflow.com/questions/1450285/… unten
mattwynne
8
@ Matt: Ist es veraltet , weil Rails 3 freigegeben wurde, oder weil jeder ist jetzt auf Rails 3, oder ...?
Lasse V. Karlsen
Vielen Dank für den Hinweis auf das veraltete. Ich hasse das an Rails - Code von vor 1 Jahr ist zu alt.
JCollum
2
Für alle, die YAML - Methode in Rails 3 + zu verwenden, müssen Sie ersetzen müssen RAILS_ENVmit Rails.envund RAILS_ROOTmit Rails.root.
Ryan
Ich habe versucht, rails_config. In der Dokumentation weisen sie mich an, RailsConfig in meiner app.rb zu registrieren. Ich gehe davon aus, dass app.rb = config / application.rb. Aber wo in der application.rb soll ich das Register RailsConfig Zeile setzen?
Nhím Hổ Báo
375

In Rails 3 können anwendungsspezifische benutzerdefinierte Konfigurationsdaten im Anwendungskonfigurationsobjekt platziert werden. Die Konfiguration kann in den Initialisierungsdateien oder den Umgebungsdateien zugewiesen werden - beispielsweise für eine bestimmte Anwendung MyApp:

MyApp::Application.config.custom_config_variable = :my_config_setting

oder

Rails.configuration.custom_config_variable = :my_config_setting

Um die Einstellung zu lesen, rufen Sie einfach die Konfigurationsvariable auf, ohne sie festzulegen:

Rails.configuration.custom_config_variable
=> :my_config_setting

UPDATE Rails 4

In Rails 4 gibt es dafür einen neuen Weg => http://guides.rubyonrails.org/configuring.html#custom-configuration

Geben Sie hier die Bildbeschreibung ein

Jack Pratt
quelle
11
Für mich geht das. Ich lege meine umgebungsspezifischen Konfigurationseinstellungen in Umgebungen / {Umgebung} .rb, z. B. Umgebungen / Entwicklung.rb. Stellen Sie sicher, dass Sie Ihren Server nach dem Ändern neu starten. Es mag elegantere Techniken geben, aber ich aktualisiere eine vorhandene App, die zuvor ENV ['XXX'] in derselben Datei verwendet hat, und da ich den Umfang des Refactorings während des Upgrades begrenzen möchte, hat dies gut funktioniert.
pduey
13
Dies ist eine Zuordnung, aber wie greifen Sie dann auf diesen Wert zu?
Kevzettler
9
Wenn Sie in der application.rb einer Rails 3.x-App nachsehen, wird gemäß dieser Antwort "Anwendungskonfiguration sollte in Dateien in config / initializers gespeichert werden" angezeigt. Es gibt zahlreiche Dokumentationen zum Zugriff auf die Variable ( edgeguides.rubyonrails.org/configuring.html ). Beispiel: In einer Datei namens some_variables.rb im Ordner initializers platzieren Sie die Variable wie oben beschrieben (ersetzen Sie MyApp durch den Namen Ihrer App). Wenn Sie sie verwenden möchten, rufen Sie einfach config.custom_config_variable auf. Sie können natürlich einen beliebigen Variablennamen verwenden . @ Jack Pratt könnten Sie eine vollständigere Antwort bearbeiten?
Jamesc
48
Alter, einfach: Pfad: config/environments/production.rb Konfiguration: config.whatever = false Zugriff überall: Rails.configuration.whatever
Victor S
5
Beachten Sie, dass sich etwas beschweren würde, wenn Sie etwas nur in der Produktion einstellen und versuchen, in einer anderen Umgebung darauf zuzugreifen undefined method.
Lulalala
69

In Rails 3.0.5 hat der folgende Ansatz für mich funktioniert:

In config/environments/development.rb, Schreib

config.custom_config_key = :config_value

Der Wert custom_config_keykann dann aus anderen Dateien mit referenziert werden

Rails.application.config.custom_config_key
Rob Dawson
quelle
4
Beachten Sie, dass sich etwas beschweren würde, wenn Sie etwas nur in der Produktion einstellen und versuchen, in einer anderen Umgebung darauf zuzugreifen undefined method.
Lulalala
Ich habe dies in Rails 4.1 versucht und method_missing': undefined method erhalte die Fehlermeldung "... store 'for # <Rails :: Application :: Configuration: 0x007f9f735b7240> ...". Ich habe versucht, die Konfigurationsvariable "config.store.works" hinzuzufügen.
Spundun
1
@ Spundun Du bekommst diesen Fehler, weil Rails nicht weiß, was storeist. Um die Methode in dieser Antwort zu verwenden, können Sie entweder Ihre Variable umbenennen store_worksoder einen config.storeBlock mit worksder darin definierten erstellen .
Paul Pettengill
Danke, das habe ich schließlich herausgefunden. Da es sich um verschachtelte Hashes handelt, muss ich leere Hashes rekursiv initialisieren, wenn ich Punkte in meinen Konfigurationsnamen verwenden möchte.
Spundun
31

Dies funktioniert in Schienen 3.1:

in config / environment.rb (oder in config / environment / .., um eine bestimmte Umgebung zu erreichen):

YourApp::Application.config.yourKey = 'foo'

Dies ist in Controllern oder Ansichten wie diesen zugänglich:

YourApp::Application.config.yourKey

(Ihre App sollte durch Ihren Anwendungsnamen ersetzt werden.)

Hinweis : Es handelt sich um Ruby-Code. Wenn Sie also viele Konfigurationsschlüssel haben, können Sie dies tun:

in config / environment.rb:

YourApp::Application.configure do
  config.something = foo
  config.....
  config....
  .
  config....
end
Alain Beauvois
quelle
2
camelCase: o benutze snake_case!
siegy22
30

In Schienen 4

Angenommen, Sie fügen Ihre benutzerdefinierten Variablen in eine Yaml-Datei ein:

# config/acme.yml
development:
  :api_user: 'joe'
  :api_pass: 's4cret'
  :timeout: 20

Erstellen Sie einen Initialisierer, um sie zu laden:

# config/initializers/acme.rb
acme_config = Rails.application.config_for :acme

Rails.application.configure do
  config.acme = ActiveSupport::OrderedOptions.new
  config.acme.api_user = acme_config[:api_user]
  config.acme.api_pass = acme_config[:api_pass]
  config.acme.timeout  = acme_config[:timeout]
end

Jetzt können Sie überall in Ihrer App wie folgt auf diese Werte zugreifen:

Rails.configuration.acme.api_user

Es ist praktisch, dass Sie Rails.application.config_for :acmeIhre laden acme.ymlund die richtige Umgebung verwenden.

Pymkin
quelle
21

Seit Rails 4.2 können Sie config / hi.yml ohne zusätzliche Edelsteine einfach mit verwenden Rails.application.config_for :hi.

Zum Beispiel:

  1. touch config/passwords.yml

        #config/passwords.yml
        development:
          username: 'a'
          password: 'b'
        production:
          username: 'aa'
          password: 'bb'
  1. touch config/initializers/constants.rb

    #config/initializers/constants.rb
    AUTHENTICATION = Rails.application.config_for :passwords
  1. und jetzt können Sie AUTHENTICATIONkonstant überall in Ihrer Anwendung verwenden:

    #rails c production
    :001> AUTHENTICATION['username'] => 'aa'
  2. fügen Sie dann passwords.yml zuFügen Sie .gitignore : hinzu echo /config/passwords.yml >> .gitignore, erstellen Sie eine Beispieldatei für Ihren Komfort cp /config/passwords.yml /config/passwords.example.ymlund bearbeiten Sie dann einfach Ihre Beispieldatei in Ihrer Produktionskonsole mit den tatsächlichen Produktionswerten.

Seen sind
quelle
8

Schauen Sie sich dieses hübsche Juwel an, das genau das tut: https://github.com/mislav/choices

Auf diese Weise werden Ihre vertraulichen Daten in Open Source-Projekten nicht verfügbar gemacht

Flov
quelle
4

Ich habe ein einfaches Plugin für YAML-Einstellungen erstellt: Yettings

Es funktioniert ähnlich wie der Code in Khellls Antwort, aber Sie müssen nur diese YAML-Konfigurationsdatei hinzufügen:

app/config/yetting.yml

Das Plugin erstellt dynamisch eine Klasse, mit der Sie auf die YML-Einstellungen als Klassenmethoden in Ihrer App zugreifen können:

Yetting.your_setting

Wenn Sie mehrere Einstellungsdateien mit eindeutigen Namen verwenden möchten, können Sie diese wie folgt in einem Unterverzeichnis in app / config ablegen:

app/config/yettings/first.yml
app/config/yettings/second.yml

Dann können Sie auf folgende Werte zugreifen:

FirstYetting.your_setting
SecondYetting.your_setting

Außerdem erhalten Sie Standardeinstellungen, die pro Umgebung überschrieben werden können. Sie können erb auch in der yml-Datei verwenden.

Johnmcaliley
quelle
Das offizielle Repo ist jetzt unter: github.com/charlotte-ruby/yettings (SO-Rezensent lehnte meine Bearbeitung ab und sagte, es sei zu geringfügig)
lulalala
4

Ich mag das Settingslogic- Juwel sehr. Sehr einfach einzurichten und zu verwenden.

https://github.com/binarylogic/settingslogic

Rahil Sondhi
quelle
2
Ich liebe das so weit. Wenn Sie Ihr Einstellungsobjekt in app / models / settings.rb platzieren, werden Sie auch im Dev-Modus neu geladen. Sieg!
Mat Schaffer
4

Wenn Sie Heroku verwenden oder auf andere Weise Ihre Anwendungseinstellungen als Umgebungsvariablen beibehalten müssen, ist das figaro- Juwel sehr hilfreich.

MikeH
quelle
2

Ich verwende gerne Rails-Einstellungen für globale Konfigurationswerte, die über die Weboberfläche geändert werden müssen.

zitieren
quelle
2
Ich möchte keine zusätzlichen Plugins usw. verwenden, da ich Schienen lerne. Der beste Weg, dies zu tun, wäre also ohne Plugins.
Shiv
Beachten Sie, dass hierbei eine Datenbank zum Speichern von Konfigurationen verwendet wird, die für manche Benutzer möglicherweise zu schwer sind.
Lulalala
0

Etwas, das wir bei der Arbeit anfangen, ist der ActiveSupport Ordered Hash

So können Sie Ihre Konfiguration sauber in den Umgebungsdateien definieren, z

config.service = ActiveSupport::OrderedOptions.new
config.service.api_key = ENV['SERVICE_API_KEY']
config.service.shared_secret = ENV['SERVICE_SHARED_SECRET']
mdb29
quelle
-5

Ich würde einen guten Ansatz vorschlagen, wie Sie mit der Konfiguration in Ihrer Anwendung überhaupt umgehen sollen. Es gibt drei Grundregeln:

  • Ändern Sie Ihre Konfiguration nicht als Code.
  • Konfigurationen über Bedingungen verwenden;
  • schreibe Code, der etwas bedeutet.

Um eine detailliertere Übersicht zu erhalten, folgen Sie diesem Link: Schienenkonfiguration auf die richtige Weise

paladiy
quelle