如何从 ERB 中的 YAML 节点获取子节点
How to get children from YAML nodes in ERB
我正在使用 ERB 访问 YAML 文件的内容。我如何从结构如下的 YAML 文件中直接将节点的子节点和子节点包含在 ERB 中:
Parent:
Child1: ABC
Child2:
Subchild1: 123
Subchild2: 456
Child3: XYZ
使用<%= Parent.Child2.Subchild1 %>
无效。这完全可能还是只能通过循环实现?
您将文件作为哈希值获取。示例
thing = YAML.load_file('some.yml')
puts thing["Child2"]["Subchild1"] # 123
您想要的需要动态创建 类 或实例。这在开始时可能很难理解,但也许这可以帮助您。
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
我正在使用 ERB 访问 YAML 文件的内容。我如何从结构如下的 YAML 文件中直接将节点的子节点和子节点包含在 ERB 中:
Parent:
Child1: ABC
Child2:
Subchild1: 123
Subchild2: 456
Child3: XYZ
使用<%= Parent.Child2.Subchild1 %>
无效。这完全可能还是只能通过循环实现?
您将文件作为哈希值获取。示例
thing = YAML.load_file('some.yml')
puts thing["Child2"]["Subchild1"] # 123
您想要的需要动态创建 类 或实例。这在开始时可能很难理解,但也许这可以帮助您。
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