如何使用环境变量来避免在database.yml中硬编码postgresql的用户名和密码?

时间:2016-11-03 12:52:43

标签: ruby-on-rails

我创建了一个名为sample_app的新Rails应用程序,我使用postgresql作为我的db(我已经创建了一个postgresql用户名和密码)。我使用此设置指南https://gorails.com/setup/ubuntu/16.04

所以我运行这个命令 set dep [$AdminConfig getid /Deployment:my-ear/] set depObject [$AdminConfig showAttribute $dep deployedObject] set classldr [$AdminConfig showAttribute $depObject classloader] $AdminConfig showall $classldr $AdminConfig modify $classldr {{mode PARENT_LAST}} $AdminConfig save $AdminConfig showall $classldr 。然后我必须编辑rails new sample_app -d postgresql以匹配我刚刚创建的postgresql用户名和密码的用户名和密码。但我不想硬编码因为我将使用git。

我从数字海洋找到了这个教程,建议使用:

config/database.yml

这是正确的代码吗?如果是这样,因为我的应用程序名为sample_app,我的代码应该是?

username: <%= ENV['APPNAME_DATABASE_USER'] %>
password: <%= ENV['APPNAME_DATABASE_PASSWORD'] %>

如果这不是正确的,你能帮助我吗?谢谢!

3 个答案:

答案 0 :(得分:7)

您可以通过多种方式设置环境变量。

以下是其中两个,

选项一:通过yml文件设置ENV变量

创建文件config/local_env.yml

<强>配置/ local_env.yml:

SAMPLE_APP_DATABASE_USER: 'your username'
SAMPLE_APP_DATABASE_PASSWORD: '******'

以上是您将使用的名称, ENV['SAMPLE_APP_DATABASE_USER'] 这些可以是您希望的名称。您可以使用任何名称,但我们应该在ENV参考中使用相同的名称

将其添加到gitignore:

/config/local_env.yml

更改application.rb

中的一些代码

<强> application.rb中:

config.before_configuration do
  env_file = File.join(Rails.root, 'config', 'local_env.yml')
  YAML.load(File.open(env_file)).each do |key, value|
    ENV[key.to_s] = value
  end if File.exists?(env_file)
end

代码打开config / local_env.yml文件,读取每个键/值对,并设置环境变量。

使用环境变量:

username: <%= ENV['SAMPLE_APP_DATABASE_USER'] %>
password: <%= ENV['SAMPLE_APP_DATABASE_PASSWORD'] %>

选项二:使用费加罗宝石

gem利用Ruby设置环境变量以及读取它们的能力。 gem会在Rails应用程序中配置其他任何内容之前读取config/application.yml文件并设置环境变量。

以下是如何使用它。在Gemfile中,添加:

<强> gem 'figaro'

并运行 bundle install

gem提供了一个生成器:

<强> $ bundle exec figaro install

生成器会创建 config/application.yml 文件并修改.gitignore file以防止将文件签入git存储库。

您可以将环境变量作为键/值对添加到config/application.yml

SAMPLE_APP_DATABASE_USER: 'your username'
SAMPLE_APP_DATABASE_PASSWORD: '******'

环境变量将作为ENV变量在应用程序的任何位置使用:

<强> ENV["SAMPLE_APP_DATABASE_USER"]

Here are the remaining ways you can achieve the same.

答案 1 :(得分:3)

你可以随便叫它......

username: <%= ENV['CARROTS'] %>
password: <%= ENV['BEANS'] %>

您只需确保部署脚本正确设置变量CARROTS和BEANS。

答案 2 :(得分:1)

试试这个宝石dotenv-rails

将此添加到Gemfile:

gem 'dotenv-rails', :groups => [:development, :test]

捆绑它。现在,在您应用的目录中创建一个.env文件,其中包含以下内容:

SAMPLE_APP_DATABASE_USER: "devuser"
SAMPLE_APP_DATABASE_PASSWORD: "devuser"

重启服务器你很高兴。启动应用程序时会导出这些变量,您可以在database.yml文件

中访问这些变量
username: <%= ENV['SAMPLE_APP_DATABASE_USER'] %>
password: <%= ENV['SAMPLE_APP_DATABASE_PASSWORD'] %>

阅读dotenv-rails documentation了解更多信息