我想在我的amazon_s3.yml配置文件中执行类似的操作:
access_key_id: ENV['S3_KEY']
secret_access_key: ENV['S3_SECRET']
......但我知道这不起作用。不确定它是否可行,但是你可以将Ruby代码放在YAML文件中吗?
答案 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)
在这种特定情况下,您必须查看正在加载文件的内容 - 在某些情况下, 它可能已被设计为直接将其加载到环境之外,或者您可能需要:
由于有一些使用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时要非常小心,因为它会带来严重的安全风险