Это старый пост, но у меня была похожая потребность, и это решение, которое я придумал.Это что-то вроде хака, но это работает и может быть улучшено.
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 имя переменной (в данном случае «data»), которая можетили может не существовать.Возможно, лучшим решением было бы использовать $, а затем заменить его именем переменной в 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