Це стара публікація, але у мене була подібна потреба, і це рішення я придумав. Це трохи хак, але він працює і може бути вдосконалений.
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
Великим мінусом є те, що він вбудовує в документ yaml ім'я змінної (в даному випадку "дані"), яке може існувати, а може і не існувати. Можливо, кращим рішенням було б використовувати $, а потім замінити його на ім'я змінної в Ruby до ERB. Крім того, щойно перевірено за допомогою hashes2ostruct, який дозволяє позначити тип data.theme.name, що набагато легше для очей. Все, що потрібно, - обернути цим YAML :: load
data = hashes2ostruct(YAML::load("---" + doc))
Тоді ваш документ 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