ฉันจะแยกไฟล์ YAML ใน Ruby ได้อย่างไร


210

ฉันต้องการทราบวิธีการแยกไฟล์ YAML ด้วยเนื้อหาต่อไปนี้:

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

ขณะนี้ฉันกำลังพยายามวิเคราะห์ด้วยวิธีนี้:

@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

แต่ดูเหมือนจะไม่ทำงานและทำให้ฉันมีข้อผิดพลาดว่าค่าเป็นศูนย์

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

ถ้าฉันลองสิ่งนี้มันจะทำให้สตริงทั้งหมด (fo_globallazyload-minholla-min):

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

1
คุณสามารถให้ผลลัพธ์ของสคริปต์เมื่อคุณเรียกใช้หรือไม่ ไฟล์ถูกที่หรือไม่ คุณสามารถจุดไฟบนคอนโซล Rails และดูว่าทับทิมสามารถมองเห็นเส้นทางนั้นได้หรือไม่
ลูคัส

ใช่ไฟล์นั้นมีอยู่และอยู่ในตำแหน่งที่ถูกต้อง ฉันได้อัพเดตโพสต์ของฉันด้วยข้อผิดพลาด
alvincrespo

คำตอบ:


449

บางทีฉันหายไปบางอย่าง แต่ทำไมพยายามแยกไฟล์? ทำไมไม่เพียงแค่โหลด YAML และตรวจสอบผลลัพธ์นั้น?

หาก YAML ตัวอย่างของคุณอยู่ในsome.ymlสิ่งนี้:

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

ให้ฉัน

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

9
ฉันเห็นด้วยนั่นเป็นสิ่งที่ยอดเยี่ยมเกี่ยวกับ YAML - เราสามารถเรียงลำดับบางสิ่งบางอย่างแล้วอ่านใหม่ในภายหลังดังนั้นทำไมไม่ใช้ความสามารถนั้น
มนุษย์ดีบุก

อ่าฉันไม่ทราบว่าคุณสามารถทำได้ด้วยไฟล์ YAML ขอบคุณมาก!
alvincrespo

1
นั่นเป็นเพราะฉันใช้แท็บ ดูเหมือนว่าจะต้องการเพียงช่องว่างแทนที่จะเป็นแท็บและจากนั้นจะโยนข้อผิดพลาดทุกประเภท
FilBot3

3
อะไรคือความแตกต่างระหว่าง #load และ #load_file ในไลบรารี YAML
Jwan622

3
YAML.loadใช้สตริง YAML YAML.load_fileใช้เส้นทางไฟล์ที่เกี่ยวข้อง
Narfanator

11

ฉันมีปัญหาเดียวกัน แต่ยังต้องการได้รับเนื้อหาของไฟล์ (หลังจาก YAML ส่วนหน้า)

นี่เป็นทางออกที่ดีที่สุดที่ฉันได้พบ:

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

แหล่งที่มาและการสนทนา: https://practicingruby.com/articles/tricks-for-working-with-text-and-files


1
ตอนนี้ดูเหมือนว่าลิงก์จะกำลังฝึกหัด
รูท /articles/ …

ขอบคุณ @devstuff - ฉันได้อัพเดทลิงค์ในคำตอบแล้ว
sarfata

3

นี่คือหนึ่งซับฉันใช้จาก terminal เพื่อทดสอบเนื้อหาของไฟล์ yml:

$ 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"}}}}}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.