web-dev-qa-db-fra.com

Comment définir des variables de configuration personnalisées dans rails

Je me demandais comment ajouter des variables de configuration personnalisées à une application Rails et comment y accéder dans le contrôleur, par exemple, je veux pouvoir définir un répertoire de téléchargement dans les fichiers de configuration, par exemple, development.rb. y accéder dans un de mes contrôleurs.

Deuxièmement, je prévoyais de prendre en charge S3 pour les téléchargements dans mon application, si je voulais ajouter un fichier yaml avec l'accès s3, la clé secrète, comment l'initialiser dans mon Rails App et comment puis-je accéder les valeurs que j'ai définies dans ce fichier de configuration.

331
Shiv

Mise à jour 1

Très recommandé: je vais avec Rails Config joyau de nos jours pour le contrôle à grain fin qu'il fournit.

Update2

Si vous voulez une solution rapide, vérifiez réponse de Jack Pratt ci-dessous.

Bien que ma réponse originale ci-dessous fonctionne toujours, cette réponse est maintenant obsolète. Je recommande de regarder les mises à jour 1 et 2.

Réponse originale:

Pour une solution rapide, regarder le "Fichier de configuration YAML" conversion d’écran de Ryan Bates devrait être très utile.

En résumé:

# 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
163
khelll

Dans Rails 3, des données de configuration personnalisées spécifiques à une application peuvent être placées dans l'objet de configuration d'application. La configuration peut être affectée dans les fichiers d’initialisation ou d’environnement - par exemple pour une application donnée MyApp:

MyApp::Application.config.custom_config_variable = :my_config_setting

ou

Rails.configuration.custom_config_variable = :my_config_setting

Pour lire le paramètre, appelez simplement la variable de configuration sans la définir:

Rails.configuration.custom_config_variable
=> :my_config_setting

UPDATE Rails 4

Dans Rails 4, il existe une nouvelle méthode pour cela => http://guides.rubyonrails.org/configuring.html#custom-configuration

enter image description here

371
Jack Pratt

Dans Rails 3.0.5, l'approche suivante a fonctionné pour moi:

Dans config/environments/development.rb, écrivez

config.custom_config_key = :config_value

La valeur custom_config_key peut ensuite être référencée à partir d'autres fichiers à l'aide de

Rails.application.config.custom_config_key
68
Rob Dawson

Cela fonctionne dans Rails 3.1:

dans config/environment.rb (ou dans config/environnements/.. pour cibler un environnement spécifique):

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

Ce sera accessible dans le contrôleur ou des vues comme ceci:

YourApp::Application.config.yourKey

(Votre application doit être remplacée par le nom de votre application.)

Note: C'est Ruby code, donc si vous avez beaucoup de clés de configuration, vous pouvez faire ceci:

dans config/environment.rb:

YourApp::Application.configure do
  config.something = foo
  config.....
  config....
  .
  config....
end
30
Alain Beauvois

Dans Rails 4

En supposant que vous placiez vos variables personnalisées dans un fichier yaml:

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

Créez un initialiseur pour les charger:

# 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

Maintenant, n'importe où dans votre application, vous pouvez accéder à ces valeurs comme suit:

Rails.configuration.acme.api_user

Il est pratique que Rails.application.config_for :acme charge votre acme.yml et utilise le bon environnement.

28
pymkin

Depuis Rails 4.2, sans gemmes supplémentaires (, vous pouvez charger config/hi.yml simplement en utilisant Rails.application.config_for :hi.

Par exemple:

  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. et maintenant vous pouvez utiliser AUTHENTICATION constante partout dans votre application:

    #Rails c production
    :001> AUTHENTICATION['username'] => 'aa'
    
  2. puis ajoutez passwords.yml à . gitignore : echo /config/passwords.yml >> .gitignore , créez un exemple de fichier pour votre confort cp /config/passwords.yml /config/passwords.example.yml puis éditez-le simplement dans la console de production avec les valeurs de production réelles.

19
lakesare

Je voulais juste mettre à jour ceci pour les dernières nouveautés intéressantes dans Rails 4.2, vous pouvez maintenant le faire dans n'importe lequel de vos fichiers config/**/*.rb:

config.x.whatever.you.want = 42

... et cela sera disponible dans votre application en tant que:

Rails.configuration.x.whatever.you.want

Voir plus ici: http://guides.rubyonrails.org/configuring.html#custom-configuration

12
smathy

Découvrez ce joyau en faisant exactement cela: https://github.com/mislav/choices

De cette façon, vos données sensibles ne seront pas exposées dans les projets open source

8
Flov

J'ai créé un plugin simple pour les paramètres YAML: Yettings

Cela fonctionne de la même manière que le code de la réponse de khelll, mais il vous suffit d'ajouter ce fichier de configuration YAML:

app/config/yetting.yml

Le plugin crée dynamiquement une classe qui vous permet d'accéder aux paramètres YML en tant que méthodes de classe dans votre application, comme ceci:

Yetting.your_setting

De plus, si vous souhaitez utiliser plusieurs fichiers de paramètres avec des noms uniques, vous pouvez les placer dans un sous-répertoire à l'intérieur de app/config comme ceci:

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

Ensuite, vous pouvez accéder aux valeurs comme ceci:

FirstYetting.your_setting
SecondYetting.your_setting

Il vous fournit également des paramètres par défaut pouvant être remplacés par environnement. Vous pouvez également utiliser erb dans le fichier yml.

4
johnmcaliley

J'aime vraiment le settingslogic gem. Très facile à configurer et à utiliser.

https://github.com/binarylogic/settingslogic

4
Rahil Sondhi

Si vous utilisez Heroku ou si vous avez besoin de conserver les paramètres de votre application en tant que variables d’environnement, la gemme figaro est très utile.

4
MikeH

J'aime utiliser Rails-settings pour les valeurs de configuration globales devant être modifiables via l'interface Web.

2
cite

Quelque chose que nous avons commencé à faire au travail est le ActiveSupport Ordered Hash

Ce qui vous permet de définir votre configuration proprement dans les fichiers d’environnement, par exemple.

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