2010-10-06 24 views
161

Chciałbym umieć analizować plik YAML z następujących treści:Jak przeanalizować plik YAML?

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

Obecnie staram się analizować je w ten sposób:

@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 

Ale to nie wydają się działać i daje mi błąd, że wartość jest zerowa.

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 

Gdy próbuję to, że stawia się cały ciąg (fo_globallazyload-minholla-min):

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

można dać wyjście skryptu kiedy go uruchomić? pliki we właściwym miejscu? zawsze możesz odpalić konsolę Railsów i sprawdzić, czy ruby ​​również widzą tę ścieżkę. – Lukas

+0

Tak, plik istnieje i znajduje się we właściwej lokalizacji. Ive zaktualizował mój post z błędem. – alvincrespo

Odpowiedz

380

Może ja czegoś brakuje, ale dlaczego starają się analizować plik? Dlaczego nie po prostu załadować YAML i zbadać obiekt (y), które wynikają?

Jeśli próbka YAML jest w some.yml, to:

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

daje mi

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

Zgadzam się, to wspaniale w przypadku YAML - możemy serializować coś, a następnie przeczytać go później, więc dlaczego nie skorzystać z tej możliwości. –

+0

Ah, nie wiedziałem, że możesz to zrobić z plikiem YAML. Dzięki wielkie! – alvincrespo

+0

Z jakiegoś powodu mogę wymagać yaml, ale dostaję błąd parsowania, wtedy widzę coś o Psych. Następnie, kiedy robię Psych.load ("file.yml"), po prostu wypisuje część "file.yml", a nie rzeczywistą zawartość pliku. – Pred

10

miałem ten sam problem, ale również chciał uzyskać zawartość pliku (po YAML front-materia).

To jest najlepsze rozwiązanie znalazłem:

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

Źródło i dyskusję: https://practicingruby.com/articles/shared/zmkztdzucsgv