Установка переменных среды в 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 без какой-либо упорядочивающей зависимости между инсайлерами.