Dies ist ein alter Beitrag, aber ich hatte ein ähnliches Bedürfnis und dies ist die Lösung, die ich gefunden habe. Es ist ein bisschen wie ein Hack, aber es funktioniert und könnte verfeinert werden.
require 'erb'
require 'yaml'
doc = <<-EOF
theme:
name: default
css_path: compiled/themes/<%= data['theme']['name'] %>
layout_path: themes/<%= data['theme']['name'] %>
image_path: <%= data['theme']['css_path'] %>/images
recursive_path: <%= data['theme']['image_path'] %>/plus/one/more
EOF
data = YAML::load("---" + doc)
template = ERB.new(data.to_yaml);
str = template.result(binding)
while /<%=.*%>/.match(str) != nil
str = ERB.new(str).result(binding)
end
puts str
Ein großer Nachteil ist, dass in das yaml-Dokument ein Variablenname (in diesem Fall "Daten") eingebaut wird, der möglicherweise vorhanden ist oder nicht. Vielleicht wäre eine bessere Lösung, $ zu verwenden und es dann vor ERB durch den Variablennamen in Ruby zu ersetzen. Außerdem wurde es gerade mit hashes2ostruct getestet, was eine Notation vom Typ data.theme.name ermöglicht, die für die Augen viel einfacher ist. Alles, was erforderlich ist, ist das Umschließen der YAML :: -Ladung damit
data = hashes2ostruct(YAML::load("---" + doc))
Dann kann Ihr YAML-Dokument so aussehen
doc = <<-EOF
theme:
name: default
css_path: compiled/themes/<%= data.theme.name %>
layout_path: themes/<%= data.theme.name %>
image_path: <%= data.theme.css_path %>/images
recursive_path: <%= data.theme.image_path %>/plus/one/more
EOF