Setting Environment Variables in Rails 3 (Devise + Omniauth)
Solution 1
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
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
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.
neon
Updated on July 09, 2022Comments
-
neon almost 2 years
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
-
neon almost 12 yearsawesome - works for me. and then place facebook.yml in .gitignore - correct? also, one caveat - if using the variable in another initializer (as I am with devise.rb), make sure you rename your facebook.rb to come alphabetically before the file you need the variables in. In my case, I had to rename facebook.rb to config_facebook.rb in order for it to be loaded before devise.rb
-
Dimitris over 11 yearsjust be aware that the order of that the initializers load is alphabetical. So if you need the config in another inititializer you will have to name the facebook.rb something like 01_facebook.rb (not too pretty - but works)
-
zishe over 11 yearsIs it invented by you or has it an authoritative source?
-
dsample over 11 yearsAny advice about whether to put the YAML file/Foreman .env into Git or to ignore it? I'd like to deploy to Heroku, but I'd also like to be able to publish my code on Github, so for one I'd need it checked in, the other I'd need it ignored.
-
iblue over 11 yearsMaybe create two separate branches, push one to github and the other one to Heroku?
-
Jan Hettich about 11 yearsIt's what i came up with after looking at some of the other solutions.
-
ejoubaud about 11 yearsForeman is the solution recommended by Heroku (devcenter.heroku.com/articles/config-vars), that has commands to set them for the production env. Note that you should not commit the .env file on your Version Control. Consider a README explaining how to set it up.
-
GMA almost 11 yearsNitpicking: shouldn't
config/initializer/facebook.rb
beconfig/initializers/facebook.rb
with an 's'? -
Matteo over 9 yearsI like it. It's concise (DRY) and secure.