Rails中管理配置ENV环境变量一个小技巧

在我们Rails开发的过程中,经常会遇到一些服务提供了secret token或者密码之类的需要保密的信息,我们在程序读取他们的话,一般都是从ENV里面读取。这样是比较安全的解决方法。 但ENV里面的值如何可以方便统一管理和赋值呢?下面介绍一个方法:

新建一个YAML文件类似这样的:

1
2
3
4
5
6
7
8
9
# config/application.yml
defaults: &defaults
XXX_SECRET_KEY: XXXXXX

development:
<<: *defaults

test:
<<: *defaults

把下面代码加到config/application.rb里面去

1
2
3
4
5
6
7
if File.exists?(File.expand_path('../application.yml', __FILE__))
  config = YAML.load(File.read(File.expand_path('../application.yml', __FILE__)))
  config.merge! config.fetch(Rails.env, {})
  config.each do |key, value|
    ENV[key] ||= value.to_s unless value.kind_of? Hash
  end
end

这样config/application.rb就变成这样了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# config/application.rb
require File.expand_path('../boot', __FILE__)
require 'rails/all'
# Require the gems listed in Gemfile, including any gems# you've limited to :test, :development, or :production.
Bundler.require(:default, Rails.env)

if File.exists?(File.expand_path('../application.yml', __FILE__))
  config = YAML.load(File.read(File.expand_path('../application.yml', __FILE__)))
  config.merge! config.fetch(Rails.env, {})
  config.each do |key, value|
    ENV[key] ||= value.to_s unless value.kind_of? Hash
  end
end

module NewApp
  class Application < Rails::Application
    # ...  
  end
end

这样的话Rails启动的话会自动读取config/application.yml里面的值,然后把里面的key和value设置到ENV里面去, 无需你手动分别在各种不同的环境系统里面修改/etc/environment的值。

当然记住这个文件是不能push到代码仓库的,记得加到.gitignore里面去。

评论