2012-12-19 6 views
8

私は過去に渡すために使用されるこのコードはトラヴィス上で動作するので、私はわからないんだけど、このコードスニペット未定義のメソッドサボンのための `のconfigure」:モジュール

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はませんので、最新の実行がサボン2を使用してに切り替えこれはSavon.configureのグローバルな振る舞いを止めました。あなたが私と同じ船に乗っている場合は、問題を解決しますサボンの最後の前の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

私は、あなたがそのAPP_OPTSを書いたところで、設定コードのようなconfig/initializersのファイルに質問したがっていますか?私はsavon 1.0を使用していて、savon.configで見つからないメソッドを取得していましたが、他のプロジェクトとまったく同じ方法で動作していますが、依存関係の1つがその例外をスローする可能性はありますか?あなたの助けをありがとう –

+0

私の例では、APP_OPTSは単なるアプリケーション定数です。重要な行は '@client = Savon :: Client.new(APP_OPTS)'です。これはSavon(2.0)Clientオブジェクトのインスタンスが必要なときに初期化する必要があります。あなたのエラーについては、私はあなたのGemfile.lockを再度チェックします。あなたが描いているのは、私が遭遇したSavon 1 - > 2エラーのようなものです –

関連する問題