Setting Environment Variables in Rails 3 (Devise + Omniauth)

Ruby on-RailsRuby on-Rails-3Environment VariablesOmniauthRailscasts

Ruby on-Rails Problem Overview


I've been trying to figure out how Ryan Bates, in his Facebook Authentication screencast, is setting the following "FACEBOOK_APP_ID" and "FACEBOOK_SECRET" environment variables.

provider :facebook, ENV['FACEBOOK_APP_ID'], ENV['FACEBOOK_SECRET']

There are similar-ish questions around, but no answers that I've been able to get to work on Rails 3.2.1.

UPDATE:

As of May 2013, my preferred way to handle ENV variables is via the Figaro gem

Ruby on-Rails Solutions


Solution 1 - Ruby on-Rails

You could take a look at the comments:

You can either set environment variables directly on the shell where you are starting your server:

FACEBOOK_APP_ID=12345 FACEBOOK_SECRET=abcdef rails server

Or (rather hacky), you could set them in your config/environments/development.rb:

ENV['FACEBOOK_APP_ID'] = "12345";
ENV['FACEBOOK_SECRET'] = "abcdef";

An alternative way

However I would do neither. I would create a config file (say config/facebook.yml) which holds the corresponding values for every environment. And then load this as a constant in an initializer:

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]

Then replace ENV['FACEBOOK_APP_ID'] in your code by FACEBOOK_CONFIG['app_id'] and ENV['FACEBOOK_SECRET'] by FACEBOOK_CONFIG['secret'].

Solution 2 - Ruby on-Rails

There are several options:

  • Set the environment variables from the command line:

      export FACEBOOK_APP_ID=your_app_id
      export FACEBOOK_SECRET=your_secret
    

    You can put the above lines in your ~/.bashrc

  • Set the environment variables when running rails s:

      FACEBOOK_APP_ID=your_app_id FACEBOOK_SECRET=your_secret rails s
    
  • Create a .env file with:

      FACEBOOK_APP_ID=your_app_id
      FACEBOOK_SECRET=your_secret
    

    and use either Foreman (starting your app with foreman start) or the dotenv gem.

Solution 3 - Ruby on-Rails

Here's another idea. Define the keys and values in provider.yml file, as suggested above. Then put this in your environment.rb (before the call to Application.initialize!):

YAML.load_file("#{::Rails.root}/config/provider.yml")[::Rails.env].each {|k,v| ENV[k] = v }

Then these environment variables can be referenced in the omniauth initializer without any ordering dependency among intializers.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionneonView Question on Stackoverflow
Solution 1 - Ruby on-RailsiblueView Answer on Stackoverflow
Solution 2 - Ruby on-RailsStefanView Answer on Stackoverflow
Solution 3 - Ruby on-RailsJan HettichView Answer on Stackoverflow