假设您有一个这样的 YML 文件:
en:
thanksgiving:
turkey: 'Turkey'
stuffing: 'Stuffing'
christmas:
ham: 'Bring ham'
thanksgiving:
beer: 'lots of beer'
并且您想使用 ruby 基本上像这样读取、合并和重写 YML:
en:
thanksgiving:
turkey: 'Turkey'
stuffing: 'Stuffing'
beer: 'lots of beer'
christmas:
ham: 'Bring ham'
实现这一目标的最佳/最有效方法是什么?
您需要解析文件以获得节点表示:
yml = YAML.parse( open('c:\temp\foo.yml'))
yml
变量包含整个结构。示例:键入以下内容打印实际的整个文件内容
pp yml
检查结果后,我能够编写一个安全的序列化程序。添加一个名为 config/initializers/yaml.rb
的文件
module YAML
def YAML.safe_load(file_name)
YAML::safe_load_node(YAML::parse(IO.read(file_name)))
end
def YAML.safe_load_node(input)
case input.kind
when :map
{}.tap do |h|
input.value.each do |key, node|
k,v = key.value, YAML::safe_load_node(node)
if (v.is_a?(Hash) and h[k].is_a?(Hash))
h[k] = h[k].merge(v)
elsif (v.is_a?(Array) and h[k].is_a?(Array))
h[k] = h[k] + v
else
h[k] = v
end
end
end
when :seq
input.value.map{|node| YAML::safe_load_node(node)}
when :scalar
input.value
end
end
end
现在在 Rails 控制台中:
>> y YAML::safe_load('c:/temp/test.yml')
---
en:
christmas:
ham: Bring ham
thanksgiving:
turkey: Turkey
stuffing: Stuffing
beer: lots of beer
我是一名优秀的程序员,十分优秀!