web-dev-qa-db-fra.com

Convertir Ruby Hash en YAML

J'ai besoin de convertir un hachage comme celui fourni ci-dessous en YAML lisible. On dirait que je peux nourrir YAML::load une chaîne, mais je pense que je dois d'abord la convertir en quelque chose comme ceci:

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

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

Je ne sais pas exactement comment faire cette conversion dans cette chaîne efficacement.

J'ai parcouru la documentation HASH et je n'ai rien trouvé pour to_yaml. Je l'ai trouvé en recherchant to_yaml qui devient disponible lorsque vous require yaml. J'ai également essayé d'utiliser la méthode Enumerable collect mais je suis devenu confus lorsque j'ai dû parcourir la valeur (un autre hachage).

J'essaie d'utiliser " Conversion de hachage en chaîne en Ruby " comme référence. Ma pensée était alors d'alimenter cela en YAML::load et cela générerait le YAML que je voulais.

36
Shail Patel

Voici comment je le ferais:

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

Quelles sorties:

---
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'

La classe Object a une méthode to_yaml. Je l'ai utilisé et il a généré correctement le fichier YAML.

Non, non.

Ceci provient d'une session IRB fraîchement ouverte:

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

Vous pouvez utiliser le to_yaml méthode sur un hachage pour cela, je crois après vous require yaml

5
Shail Patel