Как проанализировать файл YAML?



Я хотел бы знать, как разобрать файл 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
542   2  

2 ответов:

может быть, я что-то упустил, но зачем пытаться разобрать файл? Почему бы просто не загрузить YAML и не изучить объект(ы), что результат?

Если ваш образец ЯМЛ находится в some.yml, тогда так:

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

дает мне

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

У меня была та же проблема, но также хотел получить содержимое файла (после YAML front-matter).

Это лучшее решение, которое я нашел:

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

Comments

    Ничего не найдено.