У вас есть ряд проблем. Во-первых, в этом коде:
<%= location[host] %>
... host
является (правильно) интерпретируется как переменная или метод локального имени. Нет никакой переменной или метода с именем host
, поэтому ошибка.
Вы хотите получить доступ к значению с помощью ключа с именем "host"
, который является строкой, поэтому вы должны использовать эту строку.
<%= location["host"] %>
Вторая проблема заключается в вашем файле YAML.
reg_connection:
toronto:
- host: apple.net
- port: 701
- user: george
- ssl: true
- allowed: banana,orange
texas:
# ...
Здесь ваш есть отображение (которое, как-и проанализированный в-рубинового Hash) с одним ключом, reg_connection
. Значение, связанное с этим ключом, представляет собой сопоставление с двумя ключами: toronto
и texas
. Все идет нормально. Но значение, связанное с toronto
, представляет собой последовательность (read: array), а не отображение, поскольку каждая строка начинается с -
. Отображение имеет пять элементов, каждый из которых имеет один ключ и значение. Другим способом представления одной и той же структуры данных является то, что может помочь проиллюстрировать проблему;
{ 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"]
, которая не будет работать.
Вы можете заменить location["host"]
на reg_connection[location]["host"]
, но это перебор.Просто сделайте это:
<% reg_connection.sort.each do |location, values| -%>
<%= location %>host=<%= values["host"] %>
<%= location %>port=<%= values["port"] %>
...
Там нет необходимости, чтобы получить reg_connection
«S ключи перед вызовом sort
-вы можете просто назвать его непосредственно на хэш. Фактически это преобразует хэш в массив пар ключ-значение (двухэлементные массивы), которые Ruby не имеет проблем с сортировкой. Затем, когда мы вызываем each
, два значения передаются в блок location
(они, например, "toronto"
) и values
, хэш с "host"
, "port"
и т. Д. Ключей.
Обратите внимание, что точка 'hiera_hash()' предназначена для выполнения поиска * hash-merge *. Данные и результаты обязательно являются хешами, но только потому, что ваше значение, как ожидается, будет хешем, не означает, что вам нужно или нужно 'hiera_hash()'. Обычная функция 'hiera()' вместо этого выполняет стандартный поиск по приоритету, и она вернет хэш, если это фактически тип значения, которое он обнаруживает. –