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

Posted

技术标签:

【中文标题】在 Rails 3 中设置环境变量(设计 + Omniauth)【英文标题】:Setting Environment Variables in Rails 3 (Devise + Omniauth) 【发布时间】:2012-07-23 19:39:30 【问题描述】:

我一直试图弄清楚 Ryan Bates 在他的 Facebook Authentication screencast 中是如何设置以下“FACEBOOK_APP_ID”和“FACEBOOK_SECRET”环境变量的。

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

周围有类似的问题,但我无法在 Rails 3.2.1 上找到答案。

更新:

截至 2013 年 5 月,我处理 ENV 变量的首选方式是通过 Figaro gem

【问题讨论】:

【参考方案1】:

你可以看看the comments:

您可以直接在启动服务器的 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]

然后将代码中的ENV['FACEBOOK_APP_ID'] 替换为FACEBOOK_CONFIG['app_id'],将ENV['FACEBOOK_SECRET'] 替换为FACEBOOK_CONFIG['secret']

【讨论】:

太棒了 - 适合我。然后将 facebook.yml 放入 .gitignore - 对吗?另外,一个警告 - 如果在另一个初始化程序中使用变量(就像我使用 devise.rb 一样),请确保将 facebook.rb 重命名为在需要变量的文件之前按字母顺序排列。在我的情况下,我不得不重命名facebook.rb 到 config_facebook.rb 以便在 devise.rb 之前加载它 请注意,初始化程序加载的顺序是按字母顺序排列的。因此,如果您需要在另一个初始化程序中进行配置,则必须将 facebook.rb 命名为 01_facebook.rb 之类的名称(不太漂亮 - 但可以) 关于是否将 YAML 文件/Foreman .env 放入 Git 或忽略它的任何建议?我想部署到 Heroku,但我也希望能够在 Github 上发布我的代码,所以一个我需要它签入,另一个我需要它忽略。 也许创建两个独立的分支,一个推送到 github,另一个推送到 Heroku? 吹毛求疵:config/initializer/facebook.rb 不应该是带有“s”的config/initializers/facebook.rb【参考方案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 gem。

【讨论】:

Foreman 是 Heroku (devcenter.heroku.com/articles/config-vars) 推荐的解决方案,它具有为生产环境设置它们的命令。请注意,您不应在版本控制中提交 .env 文件。考虑一个 README 来解释如何设置它。【参考方案3】:

这是另一个想法。如上所述,在provider.yml 文件中定义键和值。然后把它放在你的environment.rb(在调用Application.initialize!之前):

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

那么这些环境变量可以在omniauth初始化器中被引用,而初始化器之间没有任何顺序依赖。

【讨论】:

它是你发明的还是有权威来源的? 这是我在查看其他一些解决方案后想到的。 我喜欢它。它简洁 (DRY) 且安全。

以上是关于在 Rails 3 中设置环境变量(设计 + Omniauth)的主要内容,如果未能解决你的问题,请参考以下文章

如何在database.yml文件中设置rails环境变量?

在 rails 3 中设置记录器

在 PHP 网站应用程序中设置环境变量的“正确”方法?

怎样在Ubuntu中设置环境变量

在 Rails 3 中设置会话超时

在Gatsby中设置环境变量