如何通过yaml文件在rails中加载配置变量

时间:2021-11-25 23:05:06

I am trying to use an environment variable in config/database.yml.

我试图在config / database.yml中使用环境变量。

This is my local_env.yml:

这是我的local_env.yml:

# Local Environment Variables
MYSQL_SOCK: "/tmp/mysql.sock"

Then I check if it is correct with the rails console and sure enough:

然后我用rails控制台检查它是否正确并且确定:

>> irb(main):002:0> ENV["MYSQL_SOCK"]
=> "/tmp/mysql.sock"

However in config/database.yml:

但是在config / database.yml中:

default: &default
  adapter: mysql2
  socket: ENV["MYSQL_SOCK"]

I get the following error:

我收到以下错误:

Mysql2::Error: Can't connect to local MySQL server through socket 'ENV["MYSQL_SOCK"]' (2)

But...

default: &default
  adapter: mysql2
  socket: "/tmp/mysql.sock"

works!

What is going wrong?

出了什么问题?

1 个解决方案

#1


0  

This practise is generally followed for defining configuration variables like app ids, secret keys, s3 credentials etc and this file is put in .gitignore.

这种做法通常用于定义配置变量,如app id,密钥,s3凭证等,此文件放在.gitignore中。

Create a yml file with settings.yml (generally) or local_env.yml. Then define your keys according to environment.

使用settings.yml(通常)或local_env.yml创建yml文件。然后根据环境定义您的密钥。

development:
  MYSQL_SOCK: "/tmp/mysql.sock"
production:
  MYSQL_SOCK: "file path here" 

And then load it via initializers. Create a file name "0_load_config.rb" inside your initializers directory. '0' is added in filename because this file should be loaded first then other initializers.

然后通过初始化程序加载它。在initializers目录中创建文件名“0_load_config.rb”。文件名中添加了“0”,因为此文件应先加载,然后再加载其他初始值设定项。

Then load local_env.yml file in a constant

然后在常量中加载local_env.yml文件

LOCAL_ENV = YAML.load_file("#{Rails.root}/config/local_env.yml")[Rails.env]

Then you can access this variable in your application. You can check via rails console also:

然后,您可以在应用程序中访问此变量。您也可以通过rails控制台检查:

LOCAL_ENV["MYSQL_SOCK"]

It will give you the vaue which you had provided in local_env.yml i.e "/tmp/mysql.sock".

它将为您提供您在local_env.yml中提供的vaue,即“/tmp/mysql.sock”。

#1


0  

This practise is generally followed for defining configuration variables like app ids, secret keys, s3 credentials etc and this file is put in .gitignore.

这种做法通常用于定义配置变量,如app id,密钥,s3凭证等,此文件放在.gitignore中。

Create a yml file with settings.yml (generally) or local_env.yml. Then define your keys according to environment.

使用settings.yml(通常)或local_env.yml创建yml文件。然后根据环境定义您的密钥。

development:
  MYSQL_SOCK: "/tmp/mysql.sock"
production:
  MYSQL_SOCK: "file path here" 

And then load it via initializers. Create a file name "0_load_config.rb" inside your initializers directory. '0' is added in filename because this file should be loaded first then other initializers.

然后通过初始化程序加载它。在initializers目录中创建文件名“0_load_config.rb”。文件名中添加了“0”,因为此文件应先加载,然后再加载其他初始值设定项。

Then load local_env.yml file in a constant

然后在常量中加载local_env.yml文件

LOCAL_ENV = YAML.load_file("#{Rails.root}/config/local_env.yml")[Rails.env]

Then you can access this variable in your application. You can check via rails console also:

然后,您可以在应用程序中访问此变量。您也可以通过rails控制台检查:

LOCAL_ENV["MYSQL_SOCK"]

It will give you the vaue which you had provided in local_env.yml i.e "/tmp/mysql.sock".

它将为您提供您在local_env.yml中提供的vaue,即“/tmp/mysql.sock”。