从Ruby中的变量构建字符串

Gab*_*iel 2 ruby chef-infra

在厨师环境中,对于食谱,我有这些数组:

"envs": ["ci","ui","qa"],
"services": ["service_a","service_b","service_c","service_x"]
Run Code Online (Sandbox Code Playgroud)

在模板文件中我使用了这个:

<% @envs.each do |env| %>
file {
  <%
    logfiles = ""
    @services.each do |service|
      logfiles = logfiles + "\"" + "/remotelogs/" + @env + "/" + @service + "_syslog.log\", "
    end
    logfiles = logfiles.chomp(", ")
  %>
  path           => [<%= logfiles %>]    
}
 <% end %>
Run Code Online (Sandbox Code Playgroud)

我得到的错误是这样的:

no implicit conversion of nil into String
...
Template Context:
-----------------
on line #7
  5:       logfiles = ""
  6:       @services.each do |service|
  7:         logfiles = logfiles + "\"" + "/remotelogs/" + @env + "/" + @service + "_syslog.log\", "
  8:       end
  9:         logfiles = logfiles.chomp(", ")
 (erubis):7:in `+'
 (erubis):7:in `block (3 levels) in evaluate'
 (erubis):6:in `each'
 (erubis):6:in `block (2 levels) in evaluate'
 (erubis):2:in `each'
 (erubis):2:in `block in evaluate'
Run Code Online (Sandbox Code Playgroud)

谁能告诉我我做错了什么?我猜我没有逃脱非常好的引号?

最终结果应该是三行(每个环境一个),并且对于每个行,路径应该具有以下值:

path           => ["/remotelogs/ci/service_a_syslog.log", "/remotelogs/ci/service_b_syslog.log", "/remotelogs/ci/service_c_syslog.log", "/remotelogs/ci/service_x_syslog.log"]
Run Code Online (Sandbox Code Playgroud)

Urs*_*sus 5

在这一行

logfiles = logfiles + "\"" + "/remotelogs/" + @env + "/" + @service + "_syslog.log\", "
Run Code Online (Sandbox Code Playgroud)

应该是env,不是@env.请注意,同样适用于service.这个更好

logfiles += "\"/remotelogs/#{env}/#{service}_syslog.log\", "
Run Code Online (Sandbox Code Playgroud)

或者,如果您不想转义双引号,则可以使用百分比字符串文字:

logfiles += %{"/remotelogs/#{env}/#{service}_syslog.log", }
Run Code Online (Sandbox Code Playgroud)