Установка переменных среды в Rails 3 (Devise + Omniauth)
Я пытался выяснить, как Райан Бейтс, в своем Facebook Authentication screencast, устанавливает следующие "FACEBOOK_APP_ID" и "FACEBOOK_SECRET" "переменные среды.
provider :facebook, ENV['FACEBOOK_APP_ID'], ENV['FACEBOOK_SECRET']
Есть похожие вопросы, но нет ответов, которые я смог получить в Rails 3.2.1.
UPDATE:
По состоянию на май 2013 года мой предпочтительный способ обработки переменных ENV состоит из драгоценности Figaro
Ответы
Ответ 1
Вы можете посмотреть комментарии:
Вы можете либо установить переменные среды непосредственно в оболочке, где вы запускаете свой сервер:
FACEBOOK_APP_ID=12345 FACEBOOK_SECRET=abcdef rails server
Или (довольно хакеры), вы можете установить их в свой config/environments/development.rb
:
ENV['FACEBOOK_APP_ID'] = "12345";
ENV['FACEBOOK_SECRET'] = "abcdef";
Альтернативный способ
Однако я бы тоже этого не сделал. Я бы создал конфигурационный файл (скажем config/facebook.yml
), который содержит соответствующие значения для каждой среды. И затем загрузите это как константу в инициализатор:
config/facebook.yml
development:
app_id: 12345
secret: abcdef
test:
app_id: 12345
secret: abcdef
production:
app_id: 23456
secret: bcdefg
config/initializers/facebook.rb
FACEBOOK_CONFIG = YAML.load_file("#{::Rails.root}/config/facebook.yml")[::Rails.env]
Затем замените ENV['FACEBOOK_APP_ID']
в вашем коде на FACEBOOK_CONFIG['app_id']
и ENV['FACEBOOK_SECRET']
на FACEBOOK_CONFIG['secret']
.
Ответ 2
Существует несколько вариантов:
-
Задайте переменные среды из командной строки:
export FACEBOOK_APP_ID=your_app_id
export FACEBOOK_SECRET=your_secret
Вы можете поместить вышеуказанные строки в ~/.bashrc
-
Установите переменные среды при запуске rails s
:
FACEBOOK_APP_ID=your_app_id FACEBOOK_SECRET=your_secret rails s
-
Создайте .env
файл с помощью
FACEBOOK_APP_ID=your_app_id
FACEBOOK_SECRET=your_secret
и используйте Foreman (начиная с приложения foreman start
) или dotenv драгоценный камень.
Ответ 3
Вот еще одна идея. Определите ключи и значения в файле provider.yml
, как указано выше. Затем поместите это в свой environment.rb
(перед вызовом Application.initialize!
):
YAML.load_file("#{::Rails.root}/config/provider.yml")[::Rails.env].each {|k,v| ENV[k] = v }
Затем эти переменные окружения могут ссылаться на инициализатор omniauth
без какой-либо упорядочивающей зависимости между инсайлерами.