2010-10-06 15 views
161

Ich mag würde wissen, wie eine YAML-Datei mit folgendem Inhalt zu analysieren:Wie analysiere ich eine YAML-Datei?

--- 
javascripts: 
- fo_global: 
    - lazyload-min 
    - holla-min 

Derzeit versuche ich es auf diese Weise zu analysieren:

@custom_asset_packages_yml = (File.exists?("#{RAILS_ROOT}/config/asset_packages.yml") ? YAML.load_file("#{RAILS_ROOT}/config/asset_packages.yml") : nil) 
    if [email protected]_asset_packages_yml.nil? 
     @custom_asset_packages_yml['javascripts'].each{ |js| 
     js['fo_global'].each{ |script| 
     script 
     } 
     } 
    end 

Aber es scheint nicht zu funktionieren und gibt mir einen Fehler, dass der Wert Null ist.

You have a nil object when you didn't expect it! 
You might have expected an instance of Array. 
The error occurred while evaluating nil.each 

Wenn ich das versuchen, bringt es die gesamte Zeichenfolge aus (fo_globallazyload-minholla-min):

if [email protected]_asset_packages_yml.nil? 
      @custom_asset_packages_yml['javascripts'].each{ |js| 
      js['fo_global'] 
      } 
     end 
+1

können Sie die Ausgabe des Skripts geben, wenn Sie es laufen? Dateien am richtigen Ort? Sie können immer eine Rails-Konsole starten und sehen, ob Ruby diesen Pfad auch sehen kann. – Lukas

+0

Ja, die Datei existiert und ist am richtigen Ort. Ich habe meinen Beitrag mit dem Fehler aktualisiert. – alvincrespo

Antwort

380

Vielleicht bin ich etwas fehlt, aber warum versuchen, die Datei zu analysieren? Warum laden Sie nicht einfach die YAML und untersuchen die Objekte, die sich ergeben?

Wenn Ihre Probe YAML in some.yml ist, dann das:

require 'yaml' 
thing = YAML.load_file('some.yml') 
puts thing.inspect 

gibt mir

{"javascripts"=>[{"fo_global"=>["lazyload-min", "holla-min"]}]} 
+8

Ich stimme zu, das ist das Wunderbare an YAML - wir können etwas serialisieren und es später wieder einlesen, also warum nicht diese Fähigkeit nutzen. –

+0

Ah, ich wusste nicht, dass Sie das mit einer YAML-Datei machen können. Vielen Dank! – alvincrespo

+0

Aus irgendeinem Grund kann ich yaml verlangen, aber ich bekomme einen Parsefehler, dann sehe ich etwas über Psych. Wenn ich dann Psych.load ("file.yml") mache, gibt es nur den Teil "file.yml" aus und nicht den tatsächlichen Inhalt der Datei. – Pred

10

ich hatte das gleiche Problem, aber wollte auch den Inhalt der Datei erhalten (nach dem YAML Front-Sache).

Dies ist die beste Lösung, die ich habe gefunden:

if (md = contents.match(/^(?<metadata>---\s*\n.*?\n?)^(---\s*$\n?)/m)) 
    self.contents = md.post_match 
    self.metadata = YAML.load(md[:metadata]) 
end 

Quelle und Diskussion: https://practicingruby.com/articles/shared/zmkztdzucsgv

Verwandte Themen