Sie haben eine Reihe von Problemen. Der erste ist, dass in diesem Code:
<%= location[host] %>
... host
ist (korrekt) als lokale Variable oder Methodennamen interpretiert. Es gibt keine Variable oder Methode namens host
, daher der Fehler.
Sie möchten auf den Wert mit dem Schlüssel "host"
zugreifen, der eine Zeichenfolge ist, also müssen Sie diese Zeichenfolge verwenden.
<%= location["host"] %>
Das zweite Problem ist in Ihrer YAML-Datei.
reg_connection:
toronto:
- host: apple.net
- port: 701
- user: george
- ssl: true
- allowed: banana,orange
texas:
# ...
Hier haben Ihre eine Abbildung (das ist gleich und in-einem Ruby-Hash analysiert) mit einem einzigen Schlüssel, reg_connection
. Der diesem Schlüssel zugeordnete Wert ist selbst eine Zuordnung mit zwei Schlüsseln, toronto
und texas
. So weit, ist es gut. Aber der Wert, der toronto
zugeordnet ist, ist eine Sequenz (lesen: Array), keine Zuordnung, da jede Zeile mit beginnt. Das Mapping hat fünf Elemente, von denen jedes einen einzelnen Schlüssel und Wert hat. Eine andere Möglichkeit, die gleiche Datenstruktur darzustellen, ist dies, was zur Veranschaulichung des Problems beitragen kann.
{ reg_connection:
{ toronto:
[ { host: apple.net },
{ port: 701 },
{ user: george },
# ...
],
texas:
# ...
}
}
Was Sie wollen, nehme ich an, ist für diese Struktur innerste Daten eine Zuordnung zu sein, nicht eine Folge:
reg_connection:
toronto:
host: apple.net
port: 701
user: george
ssl: true
allowed: banana,orange
texas:
# ...
Das dritte Problem ist mit der Art und Weise Sie versuchen, über iterieren die sich daraus ergebenden Hashes:
<% reg_connection.keys().sort.each do |location| -%>
<%= location %>host=<%= location["host"] %>
<%= location %>port=<%= location["port"] %>
...
Sie reg_connection.keys.sort.each
(Anmerkung: in idiomatische Ruby Klammern sind für leere Argumentlisten weggelassen) genannt haben, was bedeutet, dass Sie nicht über die Standorte laufen, yo Sie durchlaufen die Schlüssel des reg_connection
Hash. Mit anderen Worten, Sie durchlaufen das Array ["toronto", "texas"]
, sodass die folgende Zeile "toronto"["host"]
entspricht, was nicht funktionieren wird.
Sie könnte ersetzen location["host"]
mit reg_connection[location]["host"]
, aber das ist übertrieben.Genau dies tut:
<% reg_connection.sort.each do |location, values| -%>
<%= location %>host=<%= values["host"] %>
<%= location %>port=<%= values["port"] %>
...
Es gibt keine Notwendigkeit reg_connection
‚s Schlüssel zu erhalten, bevor sort
Aufruf -Sie kann es direkt auf dem Hash nennen. Dadurch wird der Hash-Wert in ein Array von Schlüssel/Wert-Paaren (Arrays mit zwei Elementen) konvertiert, die Ruby problemlos sortieren kann. Dann, wenn wir each
anrufen, werden zwei Werte an den Block location
(sie Schlüssel, zum Beispiel "toronto"
) und values
der Hash mit "host"
, "port"
usw. Schlüssel übergeben.
Beachten Sie, dass der Punkt von 'hiera_hash()' ist, eine * Hash-Merge * -Lookup durchzuführen. Die Daten und Ergebnisse sind notwendigerweise Hashes, aber nur weil Ihr Wert ein Hash ist, bedeutet das nicht, dass Sie 'hiera_hash()' brauchen oder wollen. Die gewöhnliche 'hiera()' -Funktion führt stattdessen eine Suche mit Standardpriorität durch und gibt einen Hash zurück, wenn dies tatsächlich der Typ des Wertes ist, der entdeckt wird. –