Подтвердить что ты не робот

Ruby on Rails: можете ли вы поместить код Ruby в конфигурационный файл YAML?

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

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

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

4b9b3361

Ответ 1

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

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

Или даже

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

To:

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

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

  • Обезьяна Зафиксируйте код
  • Fork + Используйте свою собственную версию.

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

Ответ 2

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

Try:

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

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

Ответ 3

Использование 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'] %>

Ответ 4

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

default: &default
  adapter: <%= 'mysql2' %>

Ответ 5

В 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, поскольку он может подвергнуть серьезную угрозу безопасности