344 votes

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, et pouvoir y accéder dans un de mes contrôleurs.

Deuxièmement, je prévoyais d'avoir un support 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 puis-je l'initialiser dans mon application Rails et comment puis-je accéder aux valeurs que j'ai définies dans ce fichier de configuration.

1 votes

0 votes

Légèrement lié : N'oubliez pas de redémarrer le serveur lorsque vous ajoutez de nouvelles variables de configuration.

380voto

Jack Pratt Points 2569

Dans Rails 3, les données de configuration personnalisées propres à une application peuvent être placées dans l'objet de configuration de l'application. La configuration peut être assignée dans les fichiers d'initialisation ou les fichiers d'environnement -- disons que 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, il suffit d'appeler la variable de configuration sans la définir :

Rails.configuration.custom_config_variable
=> :my_config_setting

UPDATE Rails 4

Dans Rails 4, il y a une nouvelle façon de le faire =>. http://guides.rubyonrails.org/configuring.html#custom-configuration

enter image description here

0 votes

Cela ne semble pas vraiment fonctionner. Je suis incapable de référencer la variable ailleurs dans l'application. Il n'est pas non plus mentionné qu'il est possible de procéder de cette manière ici : guides.rubyonrails.org/configuration.html

11 votes

Cela fonctionne pour moi. Je place mes paramètres de configuration spécifiques à mon environnement dans environments/{environment}.rb, par exemple, environments/development.rb. Veillez à redémarrer votre serveur après toute modification. Il existe peut-être des techniques plus élégantes, mais je mets à jour une application existante qui utilisait auparavant ENV['XXX'] dans le même fichier, et comme je veux limiter la quantité de remaniement pendant la mise à jour, cela a bien fonctionné.

13 votes

C'est une affectation mais comment accéder à cette valeur alors ?

169voto

khelll Points 12222

Mise à jour 1

Très recommandé : Je vais avec Rails Config Il s'agit aujourd'hui d'un joyau pour le contrôle fin qu'il offre.

Mise à jour2

Si vous voulez une solution rapide, consultez Réponse de Jack Pratt ci-dessous.

Bien que ma réponse originale ci-dessous fonctionne toujours, cette réponse est maintenant dépassée. Je vous recommande de consulter les mises à jour 1 et 2.

Réponse originale :

Pour une solution rapide, regardez le "fichier de configuration YAML". acteurs de l'écran par 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

64 votes

Cette réponse est dépassée. Voir stackoverflow.com/questions/1450285/ en dessous de

9 votes

@matt : Est-il périmé parce que Rails 3 a été publié, ou parce que tout le monde est maintenant sur Rails 3, ou ... ?

0 votes

Merci d'avoir souligné le caractère obsolète. Je déteste ça à propos de Rails - le code d'il y a un an est trop vieux.

70voto

Rob Dawson Points 949

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

Sur config/environments/development.rb , écrivez

config.custom_config_key = :config_value

La valeur custom_config_key peut ensuite être référencé à partir d'autres fichiers en utilisant

Rails.application.config.custom_config_key

4 votes

Attention, si vous définissez quelque chose uniquement en production et que vous essayez d'y accéder dans un autre environnement, le système se plaindra. undefined method .

0 votes

J'ai essayé ceci dans rails 4.1 et j'obtiens des erreurs, "... method_missing': undefined method store' pour #<Rails::Application::Configuration:0x007f9f735b7240>...". J'essayais d'ajouter la variable de configuration "config.store.works".

1 votes

@Spundun Vous obtenez cette erreur, car Rails ne sait pas ce qu'il faut faire. store est. Afin d'utiliser la méthode dans cette réponse, vous pouvez soit renommer votre variable store_works ou créer un config.store bloc avec works qui y sont définis.

32voto

Alain Beauvois Points 2572

Cela fonctionne dans rails 3.1 :

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

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

Ceci sera accessible dans le contrôleur ou les vues comme ceci :

YourApp::Application.config.yourKey

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

Note : C'est du code Ruby, 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

2 votes

CamelCase :o utiliser snake_case !

8voto

Flov Points 542

Regardez ce petit bijou qui fait exactement cela : https://github.com/mislav/choices

Ainsi, vos données sensibles ne seront pas exposées dans des projets open source.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X