Ruby on Rails:你能把Ruby代码放在YAML配置文件中吗?

时间:2010-07-18 22:01:31

标签: ruby yaml

我想在我的amazon_s3.yml配置文件中执行类似的操作:

access_key_id: ENV['S3_KEY']
secret_access_key: ENV['S3_SECRET']

......但我知道这不起作用。不确定它是否可行,但是你可以将Ruby代码放在YAML文件中吗?

5 个答案:

答案 0 :(得分:64)

不正常/直接。我这样说是因为为了使用ruby结果,你需要在加载文件之前先使用类似ERB的东西。在代码方面,您需要从以下内容出发:

loaded_data = YAML.load_file("my-file.yml")

甚至

loaded_data = YAML.load(File.read("my-file.yml"))

要:

loaded_data = YAML.load(ERB.new(File.read("my-file.yml")).result)

在这种特定情况下,您必须查看正在加载文件的内容 - 在某些情况下, 它可能已被设计为直接将其加载到环境之外,或者您可能需要:

  1. Monkey Patch the code
  2. Fork +使用您的自定义版本。
  3. 由于有一些使用amazon_s3.yml的插件,可能值得发布您正在使用哪个库使用它 - 或者,我相信快速谷歌AWS库允许您将AMAZON_ACCESS_KEY_ID和AMAZON_SECRET_ACCESS_KEY定义为env vars并且它将开箱即用。

答案 1 :(得分:11)

如果它是通过ERB解释的,那么它就像ERB视图一样,Ruby代码在<%%>

之间。

尝试:

access_key_id: <%= ENV['S3_KEY'] %>
secret_access_key: <%= ENV['S3_SECRET'] %>

......看看它是否有效

答案 2 :(得分:2)

使用fd。的示例,如果您的应用程序配置为使用HAML,请尝试使用字符串插值替换ERB语法。 。E.g,:

access_key_id: #{ENV['S3_KEY']}
secret_access_key: #{ENV['S3_SECRET']}

而不是:

access_key_id: <%= ENV['S3_KEY']} %>
secret_access_key: <%= ENV['S3_SECRET'] %>

答案 3 :(得分:1)

对我来说就像一个魅力,没有任何额外的代码(Rails 4.2):

default: &default
  adapter: <%= 'mysql2' %>

答案 4 :(得分:1)

在rails 4.2中使用ERB语法将评估代码并返回字符串。

# environment variables
S3_KEY=01234
S3_SECRET=56789

# yaml file
access_key_id: <%= ENV['S3_KEY'] %>
secret_access_key: <%= ENV['S3_SECRET'] %>

# then you can do
ENV.fetch('access_key_id')
 => "01234"
ENV.fetch('secret_access_key')
 => "56789"

您还可以在YAML文件中的字符串中编写ruby代码,然后再对其进行评估

# yaml file
retry_interval: '5.minues'

# then you can do
eval(ENV.fetch('retry_interval'))
 => 300 seconds

注意:使用eval时要非常小心,因为它会带来严重的安全风险