To jest stary post, ale miałem podobną potrzebę i to jest rozwiązanie, które wymyśliłem. To trochę hack, ale działa i można go ulepszyć.
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
Dużym minusem jest to, że wbudowuje on w dokument yaml nazwę zmiennej (w tym przypadku „dane”), która może istnieć lub nie. Być może lepszym rozwiązaniem byłoby użycie znaku $, a następnie zastąpienie go nazwą zmiennej w Rubim przed ERB. Po prostu przetestowałem używanie hashes2ostruct, który pozwala na zapis typu data.theme.name, co jest znacznie łatwiejsze dla oczu. Wszystko, co jest wymagane, to opakować tym plik YAML :: load
data = hashes2ostruct(YAML::load("---" + doc))
Wtedy twój dokument YAML może wyglądać tak
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