2012-03-08 1 views
12

パラメータをloginメソッドに渡そうとしていますが、そのパラメータに基づいてベースURIを切り替えたいとします。htthppartyでbase_uriを切り替える方法

ようなので:私はメソッドからそれを呼び出すとき

class Managementdb 
    include HTTParty 

    def self.login(game_name) 
     case game_name 
     when "game1" 
      self.base_uri = "http://game1" 
     when "game2" 
      self.base_uri = "http://game2" 
     when "game3" 
      self.base_uri = "http://game3" 
     end 

    response = self.get("/login") 

     if response.success? 
     @authToken = response["authToken"] 
    else 
     # this just raises the net/http response that was raised 
     raise response.response  
    end 
    end 

    ... 

ベースURIは、私はそれが仕事を得るか、どのように設定されていないのですか? HTTPartyで

答えて

14

base_uri内部オプションのハッシュを設定クラスメソッドあります。カスタムクラスメソッドlogin内から動的に変更するには、メソッドとして呼び出すことができます(変数であるかのように割り当てることはできません)。

たとえば、上記のコードを変更し、これはあなたが期待するようbase_uriを設定する必要があります。

... 
case game_name 
    when "game1" 
    # call it as a method 
    self.base_uri "http://game1" 
... 

はそれがお役に立てば幸いです。

+0

これは動作しているようです:)感謝します。 –

+0

initialize()メソッドでMixinのクラスメソッドを呼び出す必要がある場合は、 'YourClassName.mixin_class_method'を呼び出す必要があります。 – spier

+19

私の 'initialize'メソッドでは、' self.class.base_uri "http://example.com"を呼び出す必要がありました。 " – hamstar

8

私はまだコメントできませんので、ここではEstanislau Trepatの回答への拡張です。

応じてクラスメソッドを呼び出し、base_uriため、すべての通話にを設定するには:あなたは別のURIにわずか数のコールを送信する方法を持っているし、状態を回避したい場合

self.base_uri "http://api.yourdomain.com" 

をエラー次のヘルパー使用することができます(元のURIに切り替えることが忘れ):上記のヘルパーで

def self.for_uri(uri) 
    current_uri = self.base_uri 
    self.base_uri uri 
    yield 
    self.base_uri current_uri 
end 

を、あなたがOに固有の呼び出しを行うことができます以下のようなTHERのURI以下:

for_uri('https://api.anotheruri.com') do 
    # your httparty calls to another URI 
end 
+1

私はこのアプローチが大好きです。しかし、これが戻り値として 'base_uri'を返さないことは重要です。あなたが戻り値で何かをする必要があるなら、それは役に立たないでしょう。これを改善するには、 'response = yield'を呼び出して、最後の行に' response'をつけてhttappyコールの応答値を返すようにしてください。 – jsookiki

+1

私はこのアプローチも好きで、もう一つ実感しました。'yield'の結果が例外になると、' base_uri'は一時的な 'base_uri'であったはずのものにぶつかってしまいます!だから 'self.base_uri'が例外の場合でも復元されることを確かめるために' begin/rescue/ensure'ブロックを使うことは良い考えです。 – nicedawg

1

私はこの質問を最初に尋ねられたとき、それが実装されたかどうか分からないが、あなたは、HTTParty要求を設定したり、リクエストごと、またはインスタンスごとに:base_uriを上書きする場合メソッド(:get、:postなど)accept optionsは、クラスオプションをオーバーライドします。

だからOPの例えば、それはこのようなものになります:他の回答の一部で提案されているように、動的にクラスメソッドを呼び出す

class Managementdb 
    include HTTParty 

    # If you wanted a default, class-level base_uri, set it here: 
    base_uri "http://games" 

    def self.login(game_name) 
    base_uri = 
     case game_name 
     when "game1" then "http://game1" 
     when "game2" then "http://game2" 
     when "game3" then "http://game3" 
     end 

    # To override base_uri for an individual request, pass 
    # it as an option: 
    response = get "/login", base_uri: base_uri 

    # ... 
    end 
end 

を、おそらくすべて要求のためのbase_uriを変更しますあなたが望むものではありません。スレッドセーフではありません。

関連する問題