Не могу сказать, что действительно рекомендую любой из этих подходов. Это то, для чего предназначены библиотеки типа erb, и они были тщательно протестированы для всех крайних случаев, о которых вы еще не думали. И все, кто прикоснется к вашему коду, будут вам благодарны. Однако, если вы действительно не хотите использовать внешнюю библиотеку, я включил несколько рекомендаций.
Метод my_eval
, который вы включили, не сработал для меня. Попробуйте что-то вроде этого:
template = '<p class="foo">#{content}</p>'
def my_eval( template, content )
eval %Q{"#{template.gsub(/"/, '\"')}"}
end
Если вы хотите обобщить это так, чтобы вы могли использовать шаблоны с переменными, отличными от content
, вы можете расширить его до чего-то вроде:
def my_eval( template, locals )
locals.each_pair{ |var, value| eval "#{var} = #{value.inspect}" }
eval %Q{"#{template.gsub(/"/, '\"')}"}
end
Этот метод будет вызываться так
my_eval( '<p class="foo">#{content}</p>', :content => 'value of content' )
Но, опять же, я бы посоветовал не катать свои собственные в этом случае.