在Rails 3(Devise + Omniauth)中设置环境变量

53

我一直在研究Ryan Bates在他的Facebook身份验证视频教程中是如何设置以下环境变量“FACEBOOK_APP_ID”和“FACEBOOK_SECRET”的。

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

有类似的问题,但我没有找到在Rails 3.2.1上能够工作的答案。

更新:

截至2013年5月,我处理环境变量的首选方法是使用Figaro gem

3个回答

119
你可以查看这些评论
你可以在启动服务器的shell上直接设置环境变量:
FACEBOOK_APP_ID=12345 FACEBOOK_SECRET=abcdef rails server

或者(比较hacky的方法)在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]

然后,用FACEBOOK_CONFIG['app_id']替换你的代码中的ENV['FACEBOOK_APP_ID'],并用FACEBOOK_CONFIG['secret']替换ENV['FACEBOOK_SECRET']


3
太棒了 - 对我来说行得通。然后将facebook.yml放在.gitignore中 - 对吗?还有一个注意点 - 如果在另一个初始化程序中使用变量(就像我在devise.rb中一样),请确保将你的facebook.rb重命名为需要变量文件的字母顺序之前的名称。在我的情况下,我不得不将facebook.rb重命名为config_facebook.rb,以便在加载devise.rb之前先加载它。 - neon
7
请注意,初始化程序加载的顺序是按字母表顺序排列的。因此,如果您需要在另一个初始化程序中使用配置文件,则必须将facebook.rb这样的文件命名为01_facebook.rb(不太美观,但可行)。 - Dimitris
1
有关于是否将YAML文件/Foreman .env放入Git或忽略它的任何建议吗?我想部署到Heroku,但我也想在Github上发布我的代码,所以对于其中一个,我需要将其检入,对于另一个,我需要将其忽略。 - dsample
也许可以创建两个不同的分支,将其中一个推送到Github,另一个推送到Heroku? - iblue
2
吹毛求疵:config/initializer/facebook.rb 应该加上一个 's' 变成 config/initializers/facebook.rb,对吗? - GMA

29

有几个选项:

  • 从命令行设置环境变量:

  • 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 gem。


Foreman是Heroku推荐的解决方案(https://devcenter.heroku.com/articles/config-vars),它具有为生产环境设置命令的功能。请注意,您不应将.env文件提交到版本控制中。考虑编写一个README文件来说明如何设置它。 - ejoubaud

12

这里有另一个想法。像上面建议的那样,在provider.yml文件中定义键和值。然后在environment.rb中加入以下内容(在调用Application.initialize!之前):

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

这些环境变量可以在omniauth初始化程序中引用,而不会出现任何初始化程序之间的排序依赖关系。


这是你发明的,还是有权威来源? - zishe
这是我在查看其他解决方案后想出的。 - Jan Hettich
我喜欢它。它简洁(DRY)且安全。 - Matteo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接