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.
Versuchen Sie ':: BigDecimal' –
@ 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
nicht, dass ich weiß. Übrigens weißt du über Massensuche und Ersatz, oder? :) Du hast auch einen Tippfehler da: 'imdent => 2'. –