2016-07-28 55 views
0

我尝试将遗留应用程序从Ruby 1.8.7升级到2.2.3。之后,builder模板的渲染会引发关于未知类的错误。Builder的XmlMarkup对象失去常量?

未初始化的不断生成器:: XmlMarkup中::的BigDecimal(NameError)

这似乎是建造:: XmlMarkup中常量中像阶级消灭。

### example.xml.builder (template) ### 
BigDecimal.new('23') # no error 

class << xml 
    def some 
    data(BigDecimal.new('23')) # raises an error in 2.2.3 
    end 
end 

xml.test { xml.some } 

### main script ### 
require 'rubygems' 
require 'builder' 
require 'bigdecimal' 

def eval_script(file) 
    xml = Builder::XmlMarkup.new 
    binding.eval(File.read(file), file) 
    xml.target! 
end 

template = File.join(File.dirname(__FILE__), 'example.xml.builder') 
puts eval_script(template) 
# Ruby 1.8.7/builder 3.2.0 => <test><data>0.23E2</data></test> 
# Ruby 2.2.3/builder 3.2.2 => ./eval_script.rb:5:in `some': uninitialized constant Builder::XmlMarkup::BigDecimal (NameError) 

我发现没有理由的行为。我该如何解决这个问题?

顺便说一句:我有与方法查找相同的问题,例如format('%d', 42)它返回完整的XML文档,但不会在Ruby 2.2.3中调用Kernel.format

+1

尝试':: BigDecimal' –

+0

@MladenJablanović双冒号前缀的作品。但是,我必须改变遗留项目中的大量代码。有没有另一种解决方案来强制对Ruby 1.8.7进行持续查找? – sschmeck

+0

不是我所知道的。顺便说一句,你知道大规模搜索和替换,对吧? :)你也有一个错字:'imdent => 2'。 –

回答

0

我发现了一个替代const_missing的解决方法,它必须应用于每个模板文件。它适用于传统应用程序。

### example.xml.builder (template) ### 
class << xml 
    def self.const_missing(name) 
    super rescue ::Object.const_get(name) 
    end 

    def some 
    data(BigDecimal.new('23')) 
    end 
end 

xml.test { xml.some } 

但每不断BigDecimal被使用时,它会触发const_missing,然后提出了一个NameError并调用Object方法。