评估字符串模板

Har*_*tty 8 ruby ruby-on-rails

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

template = '<p class="foo">#{content}</p>'
Run Code Online (Sandbox Code Playgroud)

我想根据被调用变量的当前值来评估模板content.

html = my_eval(template, "Hello World")
Run Code Online (Sandbox Code Playgroud)

这是我目前解决此问题的方法:

def my_eval template, content
  "\"#{template.gsub('"', '\"')}\""  # gsub to escape the quotes
end
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来解决这个问题?

编辑

我在上面的示例代码中使用了HTML片段来演示我的场景.我的真实场景在配置文件中有一组XPATH模板.替换模板中的绑定变量以获取有效的XPATH字符串.

我曾考虑过使用再培训局,但决定反对,因为这可能是一种过度杀伤力.

小智 21

您可以使用String的本机方法'%'来执行您想要的操作:

> template = "<p class='foo'>%s</p>"
> content = 'value of content'
> output = template % content
> puts output
=> "<p class='foo'>value of content</p>"
Run Code Online (Sandbox Code Playgroud)

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

  • 可能值得补充的是,使用这种方法你可以拥有'命名占位符,即``个人资料:%{name},%{age}"%{name:'John',年龄:25} (3认同)

EmF*_*mFi 11

您可以将字符串呈现为erb模板.看到你在rake任务中使用它,你最好使用Erb.new.

template = '<p class="foo"><%=content%></p>'
html = Erb.new(template).result(binding)
Run Code Online (Sandbox Code Playgroud)

使用最初建议的ActionController方法,涉及实例化ActionController :: Base对象并发送render或render_to_string.

  • 谢谢!我发现第二行必须是Ruby 1.9.3的ERB.new(注意大写). (2认同)
  • 如果内容有可能(永远)包含 ruby​​ 代码,那么这是危险的。即使现在没有,也许在系统的其他部分,其他程序员也会将一些用户提供的数据附加到“内容”字符串中。在另一个答案中使用 String % 更安全。 (2认同)