【问题标题】:How to build a builder dynamically with escaped values如何使用转义值动态构建构建器
【发布时间】:2010-04-22 18:09:10
【问题描述】:

现在我知道如何在不转义值的情况下构建 xml。 How to tell Builder to not to escape values

但是我需要动态构建标签。

想要的结果

<bank_info>Chase</bank_info>

我拥有的是

attr = 'bank_info'
builder = Builder::XmlMarkup.new
builder.attr { |x| x << 'bank_info' } # does not work

我可以尝试将整个东西做成一个巨大的字符串并对其进行评估。但是评估并不是那么安全。有没有更好的选择我错过了。

【问题讨论】:

    标签: ruby-on-rails ruby builder


    【解决方案1】:

    一般来说,调用您有名字的方法的最简单方法是使用send__send__。这里:

    builder = Builder::XmlMarkup.new
    builder.__send__("bank_info") do  # same effect as:  builder.bank_info do
      builder << "Chase"
    end
    

    顺便说一句,有变体public_send,以防你想确保你没有调用私有方法。它仅在 Ruby 1.9 中,您可以require "backports" 在 Ruby 1.8 中使用它。

    注意:在这种情况下,send 不起作用,正如@KandadaBoggu 所指出的,因为 Builder 覆盖了它;你必须使用__send__

    【讨论】:

    • @marc 您的代码将生成&lt;send&gt;bank_infoChase&lt;/send&gt; 作为标记。看起来 builder 正在覆盖所有默认方法。我使用tag! 方法解决了这个问题。
    • 这应该教会我不要测试我的代码!我想知道__send__ 是否也被覆盖了......无论如何,tag! 是要走的路
    • 对不起,我应该提到我希望我的数据不被转义和标记!逃脱它。这就是为什么在我的例子中我诉诸
    • 啊,所以我检查了__send__ 是你想要使用的。答案已更新
    【解决方案2】:

    试试这个:

     builder.tag! "bank_info", "Citi"
    

    【讨论】:

    • 对不起,我应该提到我希望我的数据不转义和标记!逃脱它。这就是为什么在我的示例中我使用
    猜你喜欢
    • 2017-04-11
    • 2021-10-31
    • 2018-05-29
    • 2019-08-29
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多