评估字符串模板

时间:2010-02-23 20:21:15

标签: ruby-on-rails ruby

我有一个字符串模板,如下所示

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,但决定反对,因为它可能是一种过度杀伤。

5 个答案:

答案 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>"

请参阅http://ruby-doc.org/core/classes/String.html#M000770

答案 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.

more here

答案 4 :(得分:0)

迟到但我觉得更好的方法就像ruby-style-guide

template     = '<p class="foo">%<content>s</p>'
content_text = 'Text inside p'
output = format( template , content: content_text )