2009-04-03 43 views
7

oluşturulan aşağıdakiYakut: ... YAML

require 'yaml' 
test = "I'm a b&d string" 
File.open('test.yaml', 'w') do |out| 
    out.write(test.to_yaml) 
end 

... çıkışları ... kaçan dize yaz

--- this is a b&d string 

ben çıkışa alabilirsiniz Nasıl

--- 'this is a b&d string' 

???

+0

, ben gibi karakterler & ve tutabilir tek yolu bu: (http://www.yaml.org/YAML_for_ruby.html#single-quoted_strings). Bu yaml dosyasındaki URL'leri, daha sonra bozulmadan tekrar Ruby'ye geri çekmek istediğim bir yerde saklıyorum. – neezer

cevap

19

Eğer YAML kaçan bir dize saklamak istiyorsanız YAML dönüştürmek önce #inspect kullanarak kaçmak : o kadar sahip olmadıkça

irb> require 'yaml' 
=> true 
irb> str = %{This string's a little complicated, but it "does the job" (man, I hate scare quotes)} 
=> "This string's a little complicated, but it \"does the job\" (man, I hate scare quotes)" 
irb> puts str 
This string's a little complicated, but it "does the job" (man, I hate scare quotes) 
=> nil 
irb> puts str.inspect 
"This string's a little complicated, but it \"does the job\" (man, I hate scare quotes)" 
=> nil 
irb> puts str.to_yaml 
--- This string's a little complicated, but it "does the job" (man, I hate scare quotes) 
=> nil 
irb> puts str.inspect.to_yaml 
--- "\"This string's a little complicated, but it \\\"does the job\\\" (man, I hate scare quotes)\"" 
=> nil 

YAML dizeleri alıntı etmez. Bir YAML tüketici olarak,

irb> puts (str + " ").to_yaml 
--- "This string's a little complicated, but it \"does the job\" (man, I hate scare quotes) " 
=> nil 
irb> puts %{"#{str}"}.to_yaml 
--- "\"This string's a little complicated, but it \"does the job\" (man, I hate scare quotes)\"" 
=> nil 
irb> puts (" " + str).to_yaml 
--- " This string's a little complicated, but it \"does the job\" (man, I hate scare quotes)" 
=> nil 

Ancak dize önemli olmamalı alıntı olup olmadığını,: tırnak karakterleri çevreleyen veya sonunda veya önündeki boşlukların gibi - onlar buna tırnaksız saklanan eğer kaçıracağı konusunda şeyleri içerir eğer dizeleri tırnak sana. Asla YAML metnini kendiniz ayrıştırmamalısınız - bunu kütüphanelere bırakın. YAML dosyasında alıntılanacak dizeye ihtiyacınız varsa, bu bana kötü kokuyor.

Bu sizin dizeleri var onlarda '&' ın ​​fark etmez, YAML dize koruyacak:

YAML 1.2 Specification gereğince
irb> test = "I'm a b&d string" 
=> "I'm a b&d string" 
irb> YAML::load(YAML::dump(test)) 
=> "I'm a b&d string" 
irb> YAML::load(YAML::dump(test)) == test 
=> true 
+0

Anladım. Açıklama için teşekkürler! – neezer

+7

Daha fazla açıklama için, tırnakların sadece bir değerin * başlangıç ​​* şeklinde göründüğü durumlarda kullanılması gerekir ve YAML kitaplığı bu durumda otomatik olarak dizgiyi teklif eder. YAML için ön işlem değerleri için asla gerekli değildir. – Chuck

0

JSON belge geçerli bir YAML belgedir. Bu düzeltmenin temel amacı, YAML'yi resmi altküme olarak JSON ile uyumlu hale getirmektir. Bu nedenle geçerli bir JSON dizesi geçerli bir YAML dizesidir. Bu nedenle, geçerli bir JSON dizesi geçerli bir YAML dizesidir.

require 'json' 
'my string'.to_json # => produces a valid YAML string 

Bu string.to_yaml birçok durumda işe yaramaz ERB sözdizimi ile zenginleştirilmiş YAML dosyaları için son derece kullanışlı olduğunu.

Örnek: dokümanlardan anlamak gibi

# openvpn.yml.erb 
openvpn: 
    cert: <%= ENV.fetch('OPENVPN_CERT').to_json %> 
    key: <%= ENV.fetch('OPENVPN_KEY').to_json %>