2016-07-28 29 views
0

Ich versuche, eine Legacy-Anwendung von Ruby 1.8.7 auf 2.2.3 zu aktualisieren. Danach wirft das Rendering von builder Templates Fehler über unbekannte Klassen auf.Builder XmlMarkup Objekt verliert Konstanten?

nicht initialisierte Konstante Builder :: XmlMarkup :: BigDecimal (Nameerror)

Es scheint, dass innerhalb der Builder :: XmlMarkup Konstanten wie Klassen verschwinden.

### 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) 

Ich fand keinen Grund für das Verhalten. Wie kann ich das Problem beheben?

BTW: Ich habe das gleiche Problem mit der Methode Lookup, z. B. format('%d', 42), die das vollständige XML-Dokument zurückgibt aber Kernel.format in Ruby 2.2.3 nicht aufrufen.

+1

Versuchen Sie ':: BigDecimal' –

+0

@ MladenJablanović Doppelpunkt Doppelpunkt funktioniert. Aber dann muss ich im Legacy-Projekt eine große Menge Code ändern. Gibt es eine andere Lösung, um das ständige Nachschlagen von Ruby 1.8.7 zu erzwingen? – sschmeck

+0

nicht, dass ich weiß. Übrigens weißt du über Massensuche und Ersatz, oder? :) Du hast auch einen Tippfehler da: 'imdent => 2'. –

Antwort

0

Ich fand eine Umgehungsmöglichkeit const_missing überschreiben, die auf jede Vorlage-Datei angewendet werden muss. Es funktioniert so weit für die Legacy-Anwendung.

### 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 } 

Aber jedes Mal, wenn die Konstante BigDecimal verwendet wird, löst es const_missing und wirft dann eine NameError und ruft die Object Methode.