【问题标题】:How to get children from YAML nodes in ERB如何从 ERB 中的 YAML 节点获取子节点
【发布时间】:2017-01-26 13:22:42
【问题描述】:

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

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

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

【问题讨论】:

    标签: ruby yaml erb


    【解决方案1】:

    您将文件作为哈希值。示例

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

    【讨论】:

    • 这行得通,谢谢!作为参考,生成的 ERB 代码为 <%= Parent["Child2"]["Subchild1"] %>
    • 我的荣幸先生 :)
    【解决方案2】:

    动态创建类或实例所需的内容。一开始这可能很难理解,但也许这可以帮助你。

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多