2012-12-19 3 views
8

나는이 코드정의되지 않은 메서드 Savon에 대한 '구성'모듈

Savon.configure do |config| 
    config.log = false 
    config.log_level = :error 
    HTTPI.log = false 
end 

과거에 전달하는 데 사용이 코드와 보석에 위의 오류를 받고 있어요 트래비스에서 실행, 그래서 잘 모르겠어요 Readme를 변경했을 때 이것이 변경된 이유는 무엇입니까? 이 혼란의

답변

15

일부는 내 상황에서 온다 - 유지하기 위해 보석을 상속 - 함께 gemspec에서이 라인 :

gem.add_dependency 'savon' 

version number specified을 없습니다, 최신 실행이 Savon 2를 사용으로 전환 있도록 이는 Savon.configure 전역 행동을 저지했다. 당신이 나와 같은 보트에 있다면, 문제를 해결할 수 Savon의 마지막 2.0 이전 버전이 줄을 변경 : 다음

gem.add_dependency 'savon', '~>1.2.0' 

bundle install을 당신이 잘되어야합니다.


또는 코드를 업그레이드하고 싶습니다. 나도 알아.

Savon.configure은 "problem was global state"이기 때문에 Savon 2.0에서 제거되었습니다. 앱에서 동작을 동일하게 유지하는 가장 빠른 방법은 앱 수준의 글로벌 해시를 같은 위치에 정의하는 것입니다. 그런 다음이 해시를 Savon.client 전화에 전달하면됩니다. 예를 들면 다음과 같습니다.

# Where Savon.configure was called 
APP_OPTS = { 
    # disable request logging, silences HTTPI as well 
    log:  false, 
    # Don't log Laundry xmls to STDOUT 
    log_level: :error, 
    #... etc 
} 

# Elsewhere 
@client = Savon::Client.new(APP_OPTS) 

이 점은 2.0 구성 스타일로 마이그레이션하기위한 출발점입니다. 이상적으로, 각각의 Savon 클라이언트를 초기화 할 때 항상 client-specific 2.0 options available을 고려해야합니다.

+1

모두에게 항상 최소한 주 버전에 보석 종속성을 고정 시키십시오. 이 정말로 도움이되는 대답을 작성해 주셔서 감사합니다. – rubiii

+0

config 코드의 위치와 같은 config/initializers 파일에 APP_OPTS를 어디에 쓰는지 묻고 싶습니다. savon 1.0을 사용하고 있는데 savon.config와 함께 메서드를 찾을 수 없지만 정확하게 동일한 방식으로 작동하는 다른 프로젝트가 있는데 종속성 중 하나가 해당 예외를 throw 할 가능성이 있습니까? 귀하의 도움을 주셔서 감사합니다 –

+0

내 예제에서 APP_OPTS는 단지 상수입니다. 중요한 라인은'@client = Savon :: Client.new (APP_OPTS)'이다. Savon (2.0) Client 객체의 인스턴스가 필요할 때 초기화되어야한다. 당신의 오류에 관해서는, 나는 당신의 Gemfile.lock을 다시 한번 점검 할 것입니다. 당신이 설명하는 내용은 Savon 1 -> 2 오류와 정확히 같게 들립니다. –

관련 문제