使用哈希填充ERB模板失败,符号作为数组索引

时间:2015-04-06 21:28:40

标签: ruby chef

我正在尝试使用在大厨配方中构建的散列来填充json字符串,但是仍然会将错误“Symbol as array index”命中。我在stackoverflow和google上的搜索让我无处可去,我只是好奇这里发生了什么。我对Ruby不太好,所以如果代码有点关闭,请原谅我。

属性文件:

node.default[:server][:sumologic][:sources][:apache] = Hash.new
node.default[:server][:sumologic][:sources][:apache][:type] = "LocalFile"
node.default[:server][:sumologic][:sources][:apache][:name] = "Apache Logs"
node.default[:server][:sumologic][:sources][:apache][:path_expression] = "/var/log/httpd/*.log"
node.default[:server][:sumologic][:sources][:apache][:blacklist] = Array.new
node.default[:server][:sumologic][:sources][:apache][:blacklist] << "/var/log/httpd/access.log*"
node.default[:server][:sumologic][:sources][:apache][:blacklist] << "/var/log/httpd/error.log*"
node.default[:server][:sumologic][:sources][:apache][:blacklist] << "/var/log/httpd/ssl_request_log"
node.default[:server][:sumologic][:sources][:apache][:blacklist] << "/var/log/httpd/access_log"
node.default[:server][:sumologic][:sources][:apache][:blacklist] << "/var/log/httpd/error_log"
node.default[:server][:sumologic][:sources][:apache][:category] = "test-httpd"

模板erb文件:

{
  "api.version": "v1",
  "sources": [
    <% sources.each do |source| %>
    {
      "sourceType" : "<%= source[:type] %>",
      "name": "<%= source[:name] %>",
      "pathExpression": "<%= source[:path_expression] %>",
      <% if defined?(source[:blacklist]) %>
      "blacklist": [
        <% source[:blacklist].each do |listed, index| %>
        <%  if index < source[:blacklist].length - 1 %>
        "<%= listed %>",
        <%  else %>
        "<%= listed %>"
        <%  end %>
        <% end %>
      ],
      <% end %>
      "category": "<%= source[:category] %>"
    },
    <% end %>

...

食谱代码:

template '/opt/SumoCollector/sources.json' do
  source 'sources.json.erb'
  variables({
      :sources => node[:server][:sumologic][:sources]
  })
end

1 个答案:

答案 0 :(得分:0)

您对chef属性的使用有点不对劲。它们不是哈希,而是更聪明,所以你不必将它们初始化为Hash。 删除该行:

node.default[:server][:sumologic][:sources][:apache] = Hash.new

最好在1次操作中初始化数组属性:

node.default[:server][:sumologic][:sources][:apache][:blacklist] = [
  '/var/log/httpd/access.log*',
  '/var/log/httpd/error.log*',
  '/var/log/httpd/ssl_request_log',
  '/var/log/httpd/access_log',
  '/var/log/httpd/error_log'
]

您的错误&#34;符号作为数组索引&#34;来自你的情况

<% sources.each do |source| %>
  "sourceType" : "<%= source[:type] %>",
  [...]
<% end %>

source实际上是一个数组[:apache, <hash-like-object>],因此调用source[:type]失败。

sources 实际上是类似哈希的属性集合,您应该相应地处理它。如果您将行更改为

<% sources.each do |key, source| %>
一切都会奏效。这里 key 将是&#34;:apache&#34;和来源将等于node[:server][:sumologic][:sources][:apache]