我在yaml hiera文件中有这个。
reg_connection: 多伦多: - 主持人:apple.net - 港口:701 - 用户:乔治 - ssl:true - 允许:香蕉,橙色 德州: - 主持人:pink.net - ……
你有很多问题。首先是在这段代码中:
<%= location[host] %>
... host (正确地)被解释为局部变量或方法名称。没有命名的变量或方法 host 因此错误。
host
您想要使用名为key的键访问该值 "host" ,这是一个字符串,所以你必须使用该字符串。
"host"
<%= location["host"] %>
第二个问题出在您的YAML文件中。
reg_connection: toronto: - host: apple.net - port: 701 - user: george - ssl: true - allowed: banana,orange texas: # ...
在这里你有一个映射(就像“被解析为Ruby Hash”一样,只有一个键, reg_connection 。与该键关联的值本身是具有两个键的映射, toronto 和 texas 。到现在为止还挺好。但与之相关的价值 toronto 是一个序列(读取:数组),而不是映射,因为每一行都以 - 。映射有五个项目,每个项目都有一个键和值。表示相同数据结构的另一种方法是这样,这可能有助于说明问题;
reg_connection
toronto
texas
-
{ reg_connection: { toronto: [ { host: apple.net }, { port: 701 }, { user: george }, # ... ], texas: # ... } }
我怀疑,你想要的是最内层的数据结构是一个映射,而不是一个序列:
reg_connection: toronto: host: apple.net port: 701 user: george ssl: true allowed: banana,orange texas: # ...
第三个问题是您尝试迭代结果哈希的方式:
<% reg_connection.keys().sort.each do |location| -%> <%= location %>host=<%= location["host"] %> <%= location %>port=<%= location["port"] %> ...
你打过电话 reg_connection.keys.sort.each (注意:在惯用的Ruby中,空参数列表省略了括号),这意味着你没有迭代这些位置,你正在迭代这些位置的键。 reg_connection 哈希值。换句话说,你正在迭代数组 ["toronto", "texas"] ,所以后续行相当于 "toronto"["host"] ,这是行不通的。
reg_connection.keys.sort.each
["toronto", "texas"]
"toronto"["host"]
您 可以 更换 location["host"] 同 reg_connection[location]["host"] ,但这太过分了。这样做:
location["host"]
reg_connection[location]["host"]
<% reg_connection.sort.each do |location, values| -%> <%= location %>host=<%= values["host"] %> <%= location %>port=<%= values["port"] %> ...
没有必要得到 reg_connection 在打电话之前的钥匙 sort - 你可以直接在哈希上调用它。实际上,这将把散列转换为键值对(双元素数组)的数组,Ruby在排序时没有问题。然后我们打电话 each 将两个值传递给块“r” location (他们关键,例如 "toronto" )和 values 哈希与 "host" , "port" 等键。
sort
each
location
"toronto"
values
"port"