Использование Figaro и Secrets.yml для управления переменными Env

У меня есть приложение rails 4.1, и я пытаюсь организовать переменные env. На данный момент у меня есть файл secretts.yml в моей папке config /. Я также установил камень Фигаро. Моя цель состояла в том, чтобы все мои переменные env были в файле application.yml (не проверен в git), а затем использовать файл secrets.yml (проверен в git) для сопоставления переменных из appliation.yml с приложением. Когда я печатаю файлы с помощью Rails.application.secrets, он просто показывает хэши, которые выглядят так:

:salesforce_username=>"ENV['SALESFORCE_USERNAME']"

Ни одна из моих внешних служб не работает с этой настройкой переменных env. Когда я просматриваю следы, фактически запросы ENV['ACCOUNT_ID'] передаются в таких запросах:

v2/accounts/ENV['ACCOUNT_ID']/envelopes

Кроме того, я не могу получить доступ к своим переменным env, используя Rails.application.secrets.account_id в моем приложении.

secrets.yml

development:
  account_id: <%= ENV['ACCOUNT_ID'] %>

aplication.yml

development:
  ACCOUNT_ID: "123456"

application.rb

# preload tokens in application.yml to local ENV
config = YAML.load(File.read(File.expand_path('../application.yml', __FILE__)))
config.merge! config.fetch(Rails.env, {})
config.each do |key, value|
  ENV[key] = value.to_s unless value.kind_of? Hash
end

2 ответа

Решение

Драгоценный камень обеспечивает генератор:

$ rails generate figaro:install

Генератор создает файл config/application.yml и изменяет файл .gitignore, чтобы этот файл не помещался в репозиторий git.

Вы можете добавить переменные среды как пары ключ / значение в config/application.yml:

GMAIL_USERNAME: Your_Username

Переменные среды будут доступны в любом месте вашего приложения как переменные ENV:

ENV["GMAIL_USERNAME"]

Это дает вам удобство использования одних и тех же переменных в коде, независимо от того, установлены ли они оболочкой Unix или config/application.yml в геме figaro. Переменные в файле config/application.yml будут переопределять переменные среды, установленные в оболочке Unix.

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

Figaro.env.gmail_username

Используйте этот синтаксис для установки различных учетных данных в средах разработки, тестирования или производства:

HELLO: world
development:
  HELLO: developers
production:
  HELLO: users

В этом случае, ENV["HELLO"] будет производить "разработчиков" в разработке, "пользователей" в производстве и "мир" в противном случае.

Вы говорите, что переменные ENV "передаются в запросах", но когда я смотрю на ваши фрагменты кода, я думаю, что переменные вообще никогда не обнаруживаются как таковые.

Если вы хотите вставить переменную в строку, дважды проверьте, что вы используете следующий формат, особенно # а также {}:

important_string = "v2/accounts/#{ENV['ACCOUNT_ID']}/envelopes"

На более общем замечании, если вы не уверены, какие переменные среды задаются в данной среде, самый простой способ перепроверить это открыть консоль Rails и выполнить запрос ENV вот так:

$ rails console
> puts ENV.keys # find out what ENV vars are set
=> (returns a long list of var names)
> puts ENV['DEVISE_PEPPER']
=> "067d793e8781fa02aebd36e239c7878bdc1403d6bcb7c380beac53189ff6366be"
Другие вопросы по тегам