问题
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
回答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']
.
回答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.
回答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.
来源:https://stackoverflow.com/questions/11648620/setting-environment-variables-in-rails-3-devise-omniauth