2016-07-28 3 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) 

나는 아무런 이유가 발견되지 않았다. 문제를 어떻게 해결할 수 있습니까?

BTW : 메서드 검색과 동일한 문제가 있습니다 (예 : 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 메소드를 호출합니다.

관련 문제