如何从ERB中的YAML节点获取子节点

时间:2017-01-26 13:22:42

标签: ruby yaml erb

我正在使用ERB来访问YAML文件的内容。如何从结构如下的YAML文件直接包含ERB中节点的子节点和子节点:

Parent:
  Child1: ABC
  Child2:
    Subchild1: 123
    Subchild2: 456
  Child3: XYZ

使用<%= Parent.Child2.Subchild1 %>不起作用。这有可能吗或只能通过循环来实现吗?

2 个答案:

答案 0 :(得分:1)

您将文件作为哈希值获取。实施例

thing = YAML.load_file('some.yml')
puts thing["Child2"]["Subchild1"] # 123

答案 1 :(得分:0)

您需要动态创建类或实例。这在开始时可能很难理解,但也许这可以帮助你。

require 'yaml'

def parser_yaml_as_class input
    input.each do |k,v|
        if v.class == Hash
            parser_yaml_as_class v
            new_class = Class.new do
                v.each do |sub_key,sub_value|
                    self.class_eval("def self.#{sub_key.to_sym};@#{sub_key.to_sym};end")
                    self.class_eval("def self.#{sub_key.to_sym}=(val);@#{sub_key.to_sym}=val;end")

                    if sub_value.class == Hash
                        self.send "#{sub_key.to_sym}=".to_sym, Object.const_get(sub_key)
                    else
                        self.send "#{sub_key.to_sym}=".to_sym, sub_value
                    end
                end
            end
            Object.const_set(k,new_class)
        end
    end
end

parser_yaml_as_class(YAML.load_file('in.yml'))

puts Parent.Child1
#=> "ABC"
puts Parent.Child2
#=> Child2 # Child2 class
puts Parent.Child2.Subchild1
#=> 123