2016-07-28 1 views
0

レガシーアプリケーションをRuby 1.8.7から2.2.3にアップグレードしようとしています。その後、builderテンプレートをレンダリングすると、未知のクラスに関するエラーが発生します。BuilderのXmlMarkupオブジェクトは定数を失いますか?

初期化されていない一定のビルダー:: XmlMarkup ::のBigDecimal(NameError)

クラスのようなBuilder内:: 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) 

私はその動作の理由が見つかりませんでした。どのように問題を解決できますか?

BTW:メソッドルックアップと同じ問題があります。たとえば、format('%d', 42)は完全なXMLドキュメントを返しますが、Ruby 2.2.3ではKernel.formatを呼び出しません。

+1

:: :: BigDecimal'を試してください。 –

+0

@MladenJablanović二重コロン接頭辞が機能します。しかし、その後、私はレガシープロジェクトで膨大な量のコードを変更する必要があります。 Ruby 1.8.7の絶え間ない検索を強制するもう1つのソリューションはありますか? – sschmeck

+0

私が知っているわけではありません。 btw大量検索と置換について知っていますか? :)また、あなたはそこにタイプミスがあります: '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メソッドを呼び出します。