Ruby'de bir YAML dosyasını nasıl ayrıştırabilirim?


210

Aşağıdaki içeriklere sahip bir YAML dosyasını ayrıştırma yöntemini öğrenmek istiyorum:

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

Şu anda bu şekilde ayrıştırmaya çalışıyorum:

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

Ama işe yaramıyor ve bana değerin sıfır olduğu konusunda bir hata veriyor.

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

Bunu denerseniz, tüm dize (fo_globallazyload-minholla-min) koyar:

if !@custom_asset_packages_yml.nil?
          @custom_asset_packages_yml['javascripts'].each{ |js|
            js['fo_global']
          }
        end

1
çalıştırdığınızda komut dosyasının çıktısını verebilir misiniz? dosyalar doğru yerde mi? her zaman bir Rails konsolunu çalıştırabilir ve ruby'nin de bu yolu görüp göremeyeceğini görebilirsiniz.
Lukas

Evet, dosya var ve doğru yerde. Gönderimi hatayla güncelledim.
alvincrespo

Yanıtlar:


449

Belki bir şey eksik, ama neden dosyayı ayrıştırmaya çalışalım? Neden sadece YAML'yi yüklemiyor ve sonuçta ortaya çıkan nesneleri incelemiyorsunuz?

Örnek YAML'niz varsa, some.ymlbu:

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

bana verir

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

9
Kabul ediyorum, bu YAML ile ilgili harika - bir şeyi serileştirebilir, daha sonra tekrar okuyabiliriz, neden bu yeteneği kullanmıyorsunuz?
Tin Man

Ah, bunu bir YAML dosyasıyla yapabileceğinizden habersizdim. Çok teşekkürler!
alvincrespo

1
Hah, sekmeler kullandığım içindi. Görünüşe göre sadece sekmeler yerine boşluk istiyor ve sonra her türlü hatayı atıyor.
FilBot3

3
YAML kütüphanesinde #load ve #load_file arasındaki fark nedir?
Jwan622

3
YAML.loadbir YAML dizesi YAML.load_filealır, göreli bir dosya yolu alır.
Narfanator

11

Aynı sorunu vardı ama aynı zamanda (YAML ön maddeden sonra) dosyanın içeriğini almak istedim.

Bulduğum en iyi çözüm bu:

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

Kaynak ve tartışma: https://practicingruby.com/articles/tricks-for-working-with-text-and-files


1
Bağlantı şimdi pratik
articles/…

Teşekkürler @devstuff - Cevaptaki bağlantıyı güncelledim.
sarfata

3

İşte yml dosyalarının içeriğini test etmek için terminalden kullandığım bir astar:

$ ruby  -r yaml -r pp  -e 'pp YAML.load_file("/Users/za/project/application.yml")'
{"logging"=>
  {"path"=>"/var/logs/",
   "file"=>"TacoCloud.log",
   "level"=>
    {"root"=>"WARN", "org"=>{"springframework"=>{"security"=>"DEBUG"}}}}}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.