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

Ruby 使用哈希填充ERB模板失败,符号作为数组索引,ruby,chef-infra,Ruby,Chef Infra,我正在尝试使用一个构建在厨师食谱中的哈希来填充json字符串,但一直遇到错误“Symbol as array index”。我在stackoverflow和google上的搜索毫无结果,我只是好奇这里发生了什么。我不太喜欢Ruby,所以如果代码有点不对劲,请原谅我 属性文件: node.default[:server][:sumologic][:sources][:apache] = Hash.new node.default[:server][:sumologic][:sources][:ap

我正在尝试使用一个构建在厨师食谱中的哈希来填充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"

您对chef属性的使用有点错误。它们不是散列,而是更智能的,因此您不必将它们初始化为散列。删除该行:

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'
]
作为数组索引的错误符号来自您案例中的错误符号

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

一切都会好起来的。这里的键是:apache和source将等于node[:server][:sumologic][:sources][:apache]。

OP显示了它,它是模板资源的variables属性。这些传递到erb模板的变量是模板实例的本地变量,语法是@source[]要访问它们,我不确定它在全局范围而不是本地范围内提供了什么。感谢您的解释,我阅读了这篇文章,并了解了更多我正在做的事情。一切正常,但我在使用source[:blacklist]访问黑名单时遇到问题。puts source[:blacklist]给了我一个数组[\/var/log/httpd/access.log*,\/var/log/httpd/error.log*,\/var/log/httpd/ssl\u request\u log\,\/var/log/httpd/access\u log\,\/var/log/httpd/error\u log\],所以我现在正在解决这个问题。
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'
]
<% sources.each do |source| %>
  "sourceType" : "<%= source[:type] %>",
  [...]
<% end %>
<% sources.each do |key, source| %>