2013-07-10 18 views
27

Ich muss einen Hash wie den unten angegebenen in lesbare YAML konvertieren. Es sieht aus wie ich YAML::load einen String ernähren kann, aber ich glaube, ich brauche es zu konvertieren zuerst in etwa wie folgt:Ruby Hash in YAML konvertieren

hostname1.test.com: 
    public: 51 
    private: 10 

{"hostname1.test.com"=> 
    {"public"=>"51", "private"=>"10"}, 
"hostname2.test.com"=> 
    {"public"=>"192", "private"=>"12"} 
} 

Ich bin nicht sicher, wie genau in diese Zeichenfolge, die Umwandlung zu tun, obwohl effektiv.

Ich schaute durch die HASH-Dokumentation und konnte nichts für to_yaml finden. Ich habe es gefunden, indem ich nach to_yaml gesucht habe, das verfügbar wird, wenn Sie require yaml. Ich habe auch versucht, die Enumerable-Methode collect zu verwenden, bin aber verwirrt, als ich den Wert durchlaufen musste (ein weiterer Hash).

Ich versuche "Converting hash to string in Ruby" als Referenz zu verwenden. Mein Gedanke war dann, das in YAML::load zu füttern, und das würde das YAML erzeugen, das ich wollte.

+0

Haben Sie Rubys lesen Sie [YAML Dokumentation] (http://www.ruby-doc.org/stdlib-2.0/libdoc/yaml/rdoc /YAML.html)? Wie wäre es mit "[Yaml-Kochbuch auf der YamlForRuby-Website] (http://www.yaml.org/YAML_for_ruby.html)? Außerdem ist Ihr übergebener Hash nicht gültig. Sollte es ein Array von Hashes oder ein Hash von Hashes sein –

+0

Sie sollten auch einen Code geliefert haben, der zeigt, was Sie ausprobiert haben, zusammen mit einer Erklärung, was nicht funktioniert hat: -1 –

+0

Hinzugefügte Arbeit, die ich vor der Suche nach der to_yaml-Methode geleistet habe: –

Antwort

45

hier, wie ich es tun würde:

require 'yaml' 

HASH_OF_HASHES = { 
    "hostname1.test.com"=> {"public"=>"51", "private"=>"10"}, 
    "hostname2.test.com"=> {"public"=>"192", "private"=>"12"} 
} 

ARRAY_OF_HASHES = [ 
    {"hostname1.test.com"=> {"public"=>"51", "private"=>"10"}}, 
    {"hostname2.test.com"=> {"public"=>"192", "private"=>"12"}} 
] 

puts HASH_OF_HASHES.to_yaml 
puts 
puts ARRAY_OF_HASHES.to_yaml 

Welche Ausgänge:

--- 
hostname1.test.com: 
    public: '51' 
    private: '10' 
hostname2.test.com: 
    public: '192' 
    private: '12' 

--- 
- hostname1.test.com: 
    public: '51' 
    private: '10' 
- hostname2.test.com: 
    public: '192' 
    private: '12' 

Die Object-Klasse hat ein to _yaml Methode. Ich habe das benutzt und es hat die YAML-Datei korrekt erzeugt.

Nein, tut es nicht.

Dies ist aus einer frisch IRB-Sitzung geöffnet:

Object.instance_methods.grep(/to_yaml/) 
=> [] 
require 'yaml' 
=> true 
Object.instance_methods.grep(/to_yaml/) 
=> [:psych_to_yaml, :to_yaml, :to_yaml_properties] 
2

Sie können das to_yaml Methode auf einen Hash für dieses Ich glaube, nachdem Sie require yaml

+2

Hash hat keine 'to_yaml' Methode –

+5

[Objekt hat * keine * to_yaml' Methode] (http://ruby-doc.org/core-2.0/Object.html) Nur die Klasse [YAML] (http://ruby-doc.org/stdlib-2.0/libdoc/yaml/rdoc/YAML.html) hat es und erweitert andere Klassen s wenn es erforderlich ist. –