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.