0

我已经用 ruby​​ on rails 创建了我的第一个 facebook 应用程序。在我的控制器中,我有类似的东西

 @oauth = Koala::Facebook::OAuth.new(app_id,secret_id,callback_url) (Replaced with temp values)

我想知道在我的控制器中有这些值是否可以,或者我应该将它隐藏在我的应用程序的其他地方?将它们分配给变量?

这里正确的编程习惯是什么?

4

2 回答 2

4

归根结底是要避免在版本控制系统中记录这些值。

我通常采取的方法如下:

config/application.rb在应用程序类定义中添加以下内容

# Loads app config from /config/env_vars.yml
require 'yaml'
rails_root = Rails.root || File.dirname(__FILE__) + '/../..'
config = YAML.load_file(rails_root.to_s + '/config/env_vars.yml')
if config.key?(Rails.env) && config[Rails.env].is_a?(Hash)
  config[Rails.env].each do |key, value|
    ENV[key] = value.to_s
  end
end

config/在called中创建一个文件env_vars.yml,并包含以下内容

development:
  FB_APP_ID: APP_ID_HERE
  FB_APP_SECRET: APP_SECRET_HERE

替换APP_ID_HEREAPP_SECRET_HERE使用您的 api 详细信息。根据需要向该文件添加尽可能多的其他值(即 Twitter 密钥等),并为每个环境重复(例如,如果您有不同的 FB 应用程序用于开发、登台和生产)。然后可以在您的控制器中引用这些ENV['FB_APP_ID']等。

如果使用这种方法,您可以将 env_vars.yml 从您的 VCS 中删除,这意味着您实际上并未将这些值提交到您的存储库,同时仍使它们可用于您的应用程序。


最后,如果您使用 Heroku,为每个应用程序分配这些值作为环境变量很容易(即heroku config:set FB_APP_ID=234234324234,有关更多详细信息,请参阅https://devcenter.heroku.com/articles/config-vars),无需提交这些在推送到 Heroku 之前对 repo 的值。

注意如果使用 Heroku,对上述方法有一些修改

如果从 git 中排除env_vars.yml,此文件在推送到 Heroku 时将不可用,导致您的应用程序在启动时崩溃。最简单的解决方案是修改添加到的代码config/application.rb如下:

# Loads app config from /config/env_vars.yml
unless Rails.env == 'production'
  require 'yaml'
  rails_root = Rails.root || File.dirname(__FILE__) + '/../..'
  config = YAML.load_file(rails_root.to_s + "/config/env_vars.yml")
  if config.key?(Rails.env) && config[Rails.env].is_a?(Hash)
    config[Rails.env].each do |key, value|
      ENV[key] = value.to_s
    end
  end
end

通过将其包装在条件中,如果在(Heroku 的默认环境)unless Rails.env == 'production'上运行,它将被跳过。production如果为 Heroku 使用多个环境(例如staging, uat, production),则可以将其修改为

unless %w(staging uat production).include?(Rails.env)

一旦提交并推送到 Heroku,它将不再寻找文件,让您可以通过Heroku toolbelt 命令逐个env_vars.yml应用程序设置配置变量。heroku config:set

于 2013-03-03T19:53:19.060 回答
3

看看这篇文章:http ://railsapps.github.com/rails-environment-variables.html

我更喜欢使用 figaro gem:https ://github.com/laserlemon/figaro

于 2013-03-03T19:50:10.787 回答