2012-12-19 32 views
8

Dostaję powyższy błąd w klejnot z tym fragmencie koduniezdefiniowana metoda `configure” za Savon: Moduł

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

Ten kod używany do przekazywania w przeszłości działa na Travisa, więc nie jestem pewien dlaczego to się zmieniło, kiedy zmieniłem plik Readme.

Odpowiedz

15

Część tego zamieszania pochodzi z mojej sytuacji - dziedziczenie gem do utrzymania - wzdłuż tej linii w gemspec:

gem.add_dependency 'savon' 

nie ma version number specified, więc najnowsza run przełączony na użyciu Savon 2 , które porzuciło globalne zachowanie Savon.configure. Jeśli jesteś w tej samej łodzi, jak ja, zmieniając linię do ostatniej pre-2.0 wersji Savon będzie rozwiązać problem:

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

Następnie bundle install i powinno być dobrze.


Lub chcesz uaktualnić swój kod. Wiem, że to robię.

Savon.configure został usunięty z Savon 2.0, ponieważ "problem was global state". Najszybszym sposobem zachowania tego samego zachowania w aplikacji byłoby zdefiniowanie globalnego skrótu na poziomie aplikacji w tym samym miejscu. Następnie przekazywałbyś ten skrót do każdego wywoływanego połączenia Savon.client. Na przykład:

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

Uważam to za punkt wyjścia do przejścia na styl konfiguracji 2.0. Najlepszym rozwiązaniem jest zawsze rozważenie client-specific 2.0 options available podczas inicjowania każdego klienta Savon.

+1

proszę, aby każdy zawsze uzależniał twoje klejnotowe zależności od przynajmniej wersji głównej. dziękuję za napisanie tej naprawdę przydatnej odpowiedzi. – rubiii

+0

Chciałem zapytać, gdzie piszesz ten APP_OPTS, w pliku w config/inicjalizatorach, jak gdzie był kod konfiguracyjny? Używałem Savona 1.0 i otrzymałem metodę nie znalezioną w savon.config, ale mam inny projekt używający go dokładnie w ten sam sposób i działa, czy to możliwe, że jedna z zależności rzuci ten wyjątek? dzięki za pomoc –

+0

W moim przykładzie, APP_OPTS jest po prostu stała aplikacji. Ważną linią jest '@client = Savon :: Client.new (APP_OPTS)', która powinna zostać zainicjowana, gdy potrzebujesz instancji obiektu klienta Savon (2.0). Co do twojego błędu, sprawdziłbym twoją Gemfile.lock. To, co opisujesz, brzmi dokładnie tak, jak błąd Savona 1 -> 2, na który natrafiłem –