Ruby on Rails: Вы можете поместить код Ruby в файл конфигурации YAML? - PullRequest
36 голосов
/ 19 июля 2010

Я хотел бы сделать что-то подобное в моем конфигурационном файле amazon_s3.yml:

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

... но я знаю, что это не работает. Не уверен, если это вообще возможно, но вы можете поместить код Ruby в файл YAML?

Ответы [ 5 ]

64 голосов
/ 19 июля 2010

Не нормально / напрямую.Я говорю это потому, что для того, чтобы использовать результаты ruby, вам нужно сначала использовать что-то вроде ERB перед загрузкой файла.С точки зрения кода, вам нужно перейти от чего-то вроде:

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

Или даже

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

Кому:

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

В этом конкретном случае выпридется посмотреть, что загружает файл - в некоторых случаях он уже может быть предназначен для загрузки его прямо из среды, или вам может потребоваться:

  1. Monkey Patch code
  2. Fork + Используйте свою пользовательскую версию.

Поскольку существует несколько плагинов, использующих amazon_s3.yml, возможно, стоит опубликовать, какую библиотеку вы используете, и она ее использует - в качестве альтернативы я считаюиз быстрого Google, что библиотека AWS позволяет вам определить AMAZON_ACCESS_KEY_ID и AMAZON_SECRET_ACCESS_KEY в качестве переменных env, и она заберет их из коробки.

11 голосов
/ 19 июля 2010

Вы можете, если он интерпретируется через ERB, и в этом случае он действует как представление ERB, а код Ruby находится между <% и %>

Попытка:

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

... и посмотрите, работает ли он

2 голосов
/ 03 января 2014

Используя пример fd., Попробуйте заменить синтаксис ERB с помощью интерполяции строк, если ваше приложение настроено на использование HAML.Например:

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

вместо:

access_key_id: <%= ENV['S3_KEY']} %>
secret_access_key: <%= ENV['S3_SECRET'] %>
1 голос
/ 26 января 2017

В rails 4.2 с использованием синтаксиса ERB будет оцениваться код и возвращаться строки.

# 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"

Вы также можете написать код ruby ​​в строку в своем файле YAML и затем оценить его позже

# yaml file
retry_interval: '5.minues'

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

ВНИМАНИЕ: будьте очень осторожны при использовании eval, так как это возможноопубликовать серьезную угрозу безопасности

1 голос
/ 11 марта 2016

Работает для меня как шарм без дополнительного кода (Rails 4.2):

default: &default
  adapter: <%= 'mysql2' %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...