레거시 애플리케이션을 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)
나는 아무런 이유가 발견되지 않았다. 문제를 어떻게 해결할 수 있습니까?
BTW : 메서드 검색과 동일한 문제가 있습니다 (예 : format('%d', 42)
). 전체 XML 문서를 반환하지만 Ruby 2.2.3에서는 Kernel.format
을 호출하지 않습니다.
':: BigDecimal'을 시도하십시오. –
@ MladenJablanović 이중 콜론 접두사가 작동합니다. 그런데 레거시 프로젝트에서 막대한 양의 코드를 변경해야합니다. Ruby 1.8.7을 지속적으로 조회 할 수있는 다른 솔루션이 있습니까? – sschmeck
내가 아는 것은 아닙니다. 대량 검색 및 교체에 대해 알고 있습니까? :) 또한 당신은 거기에 오타가 있습니다 :'imdent => 2'. –