2010-10-06 16 views
161

Vorrei sapere come analizzare un file YAML con i seguenti contenuti:Come analizzare un file YAML?

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

Attualmente sto cercando di analizzare in questo modo:

@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 

Ma non sembra funzionare e mi dà un errore che il valore è nullo.

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 

Se provo questo, si mette fuori l'intera stringa (fo_globallazyload-minholla-min):

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

si può dare l'output dello script quando lo si esegue? file nel posto giusto? puoi sempre aprire una console di Rails e vedere se Ruby può vedere quel percorso. – Lukas

+0

Sì, il file esiste ed è nel posto giusto. Ho aggiornato il mio post con l'errore. – alvincrespo

risposta

380

forse mi manca qualcosa, ma perché cercare di analizzare il file? Perché non caricare semplicemente lo YAML ed esaminare gli oggetti che risultano?

Se il YAML campione è in some.yml, allora questo:

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

mi dà

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

Sono d'accordo, è meraviglioso su YAML - possiamo serializzare qualcosa e poi rileggerlo più tardi, quindi perché non usare quella capacità. –

+0

Ah, non sapevo di poterlo fare con un file YAML. Grazie mille! – alvincrespo

+0

Per qualche motivo, posso richiedere yaml, ma ottengo un errore di analisi, quindi vedo qualcosa su Psych. Quindi quando eseguo Psych.load ("file.yml"), restituisce solo la parte "file.yml" e non i contenuti effettivi del file. – Pred

10

Ho avuto lo stesso problema, ma anche voluto ottenere il contenuto del file (dopo il YAML front-materia).

Questa è la soluzione migliore che ho trovato:

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

Fonte e discussione: https://practicingruby.com/articles/shared/zmkztdzucsgv