代码之家  ›  专栏  ›  技术社区  ›  Harish Shetty

评估字符串模板

  •  8
  • Harish Shetty  · 技术社区  · 14 年前

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

    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 回复  |  直到 4 年前
        1
  •  11
  •   EmFi    14 年前

    可以将字符串渲染为erb模板。看到您在rake任务中使用了这个,您最好使用Erb.new。

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

    使用最初建议的ActionController方法,包括实例化ActionController::Base对象并将render或render_发送到_字符串。

        2
  •  25
  •   seanreads    14 年前

    可以使用字符串的本机方法“%”执行任何操作:

    > 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

        3
  •  3
  •   Emily    14 年前

    我不能说我真的推荐这两种方法。这就是像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' )
    

    不过,我还是建议你在这种情况下不要自己动手。

        4
  •  0
  •   tokhi    10 年前

    这也是一个很好的例子:

    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

        5
  •  0
  •   inye    7 年前

    但我认为更好的方法是 ruby-style-guide :

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