web-dev-qa-db-fra.com

=Ruby sur rails: pouvez-vous mettre Ruby code dans un fichier de configuration YAML?

J'aimerais faire quelque chose comme ça dans mon fichier de configuration Amazon_s3.yml:

access_key_id: ENV['S3_KEY']
secret_access_key: ENV['S3_SECRET']

... Mais je sais que cela ne fonctionne pas. Je ne sais pas si c'est même possible, mais pouvez-vous mettre Ruby code dans un fichier YAML?

39
Andrew

Pas normalement/directement. Je dis cela parce que pour utiliser Ruby résultats, vous devez utiliser quelque chose comme ERB avant de charger le fichier. En termes de code, vous devez partir de quelque chose comme:

loaded_data = YAML.load_file("my-file.yml")

Ou même

loaded_data = YAML.load(File.read("my-file.yml"))

À:

loaded_data = YAML.load(ERB.new(File.read("my-file.yml")).result)

Dans ce cas particulier, vous devriez regarder ce qui charge le fichier - dans certains cas, il peut déjà être conçu pour le charger tout droit hors de l'environnement ou que vous devrez peut-être soit:

  1. Monkey patch le code
  2. Fork + Utilisez votre version personnalisée.

Comme la bibliothèque que vous utilisez qui l'utilise - c'est-à-dire à l'aide d'un rapide Google que la bibliothèque AWS vous permet de définir Amazon_access_key_id et Amazon_secret_access_key comme env Vares et il sera Choisissez-les hors de la boîte.

66
Sutto

Vous pouvez s'il est interprété par ERB, auquel cas il agit comme une vue ERB et Ruby code passe entre <% et %>

Essayer:

access_key_id: <%= ENV['S3_KEY'] %>
secret_access_key: <%= ENV['S3_SECRET'] %>

... et voir si ça marche

13
Mike Tunnicliffe

Utilisation de l'exemple de FD. Essayez d'échanger la syntaxe ERB avec une interpolation de chaîne si votre application est configurée pour utiliser HAML. Par exemple.,:

access_key_id: #{ENV['S3_KEY']}
secret_access_key: #{ENV['S3_SECRET']}

à la place de:

access_key_id: <%= ENV['S3_KEY']} %>
secret_access_key: <%= ENV['S3_SECRET'] %>
2
Noz

Fonctionne comme un charme pour moi sans code supplémentaire (rails 4.2):

default: &default
  adapter: <%= 'mysql2' %>
1
Artur Beljajev

In Rails 4.2 Utilisation de la syntaxe ERB évaluera le code et retournera les chaînes.

# environment variables
S3_KEY=01234
S3_SECRET=56789

# yaml file
access_key_id: <%= ENV['S3_KEY'] %>
secret_access_key: <%= ENV['S3_SECRET'] %>

# then you can do
ENV.fetch('access_key_id')
 => "01234"
ENV.fetch('secret_access_key')
 => "56789"

Vous pouvez également écrire Ruby code dans une chaîne dans votre fichier YAML, puis l'évaluer ultérieurement

# yaml file
retry_interval: '5.minues'

# then you can do
eval(ENV.fetch('retry_interval'))
 => 300 seconds

ATTENTION: Soyez très prudent lorsque vous utilisez EVAL, car il peut poster un risque de sécurité grave

1
HarlemSquirrel