我有一个字符串模板,如下所示
template = '<p class="foo">#{content}</p>'
我想根据名为content
的变量的当前值来评估模板。
html = my_eval(template, "Hello World")
这是我目前解决此问题的方法:
def my_eval template, content
"\"#{template.gsub('"', '\"')}\"" # gsub to escape the quotes
end
有没有更好的方法来解决这个问题?
我在上面的示例代码中使用了HTML片段来演示我的场景。我的真实场景在配置文件中有一组XPATH模板。替换模板中的绑定变量以获取有效的XPATH字符串。
我曾考虑使用ERB,但决定反对,因为它可能是一种过度杀伤。
答案 0 :(得分:21)
您可以使用String的本机方法'%'执行您想要的操作:
> template = "<p class='foo'>%s</p>"
> content = 'value of content'
> output = template % content
> puts output
=> "<p class='foo'>value of content</p>"
答案 1 :(得分:11)
您可以将字符串呈现为erb模板。看到你在rake任务中使用它,你最好使用Erb.new。
template = '<p class="foo"><%=content%></p>'
html = Erb.new(template).result(binding)
使用最初建议的ActionController方法,涉及实例化ActionController :: Base对象并发送render或render_to_string。
答案 2 :(得分:3)
我不能说我真的推荐这两种方法。这就像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' )
但是,我建议不要在这种情况下滚动你自己。
答案 3 :(得分:0)
这也是一个不错的选择:
template = "Price of the %s is Rs. %f."
# %s - string, %f - float and %d - integer
p template % ["apple", 70.00]
# prints Price of the apple is Rs. 70.000000.
答案 4 :(得分:0)
迟到但我觉得更好的方法就像ruby-style-guide:
template = '<p class="foo">%<content>s</p>'
content_text = 'Text inside p'
output = format( template , content: content_text )