2012-03-08 12 views
12

Próbuję przekazać parametr do metody login i chcę zmienić bazową wersję na podstawie tego parametru.Jak zmienić base_uri na httparty

tak:

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 

    ... 

Baza uri nie określa, kiedy nazywam ją od sposobu, w jaki sposób uzyskać to do pracy?

Odpowiedz

14

W HTTParty, base_uri jest metodą klasy klasy, która ustawia wewnętrzny skrót opcji. Aby dynamicznie zmienić ją z niestandardowej metody klasy login można po prostu nazwać ją metodą (nie przypisując jej tak, jakby była zmienną).

Na przykład zmiana kodu powyżej, należy ustawić base_uri jak można się spodziewać:

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

Nadzieję, że to pomaga.

+0

wydaje się, że to działa :) dzięki. –

+0

Jeśli chcesz wywołać metodę klasy Mixin w swojej metodzie initialize(), musisz wywołać 'YourClassName.mixin_class_method'. – spier

+19

W mojej metodzie 'initialize' musiałem wywołać' self.class.base_uri "http://example.com" 'aby to zadziałało. – hamstar

8

Nie mogę jeszcze komentować, więc tutaj jest rozszerzenie do odpowiedzi Estanislau Trepat.

Aby ustawić base_uri dla wszystkie połączenia, zadzwoń według metody klasy:

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

Jeśli chcesz mieć sposób wysyłania tylko kilka połączeń do innego URI i uniknąć stanu błędy (zapominając, aby powrócić do pierwotnego URI) można użyć następującego pomocnika:

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

z powyższego pomocnika, można dokonać konkretnych rozmów na o nne URI, jak następuje:

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

Bardzo lubię to podejście. Jednak ważne jest, aby nie zwracać wartości "base_uri" jako wartości zwracanej. To nie pomoże, jeśli musisz coś zrobić z wartością zwracaną. Aby to poprawić, 'response = yield', a następnie' response' jako ostatnia linia do zwracania wartości odpowiedzi z połączenia http: – jsookiki

+1

Podoba mi się również to podejście i użyłem go ... a następnie zrealizowałem jeszcze jedną rzecz.Jeśli twoja 'wydajność' powoduje wyjątek, twoja' baza_uri' będzie "utknąć" z tym, co powinno być tymczasowym 'base_uri'! Zatem użycie bloku 'begin/rescue/ensure', aby upewnić się, że twoje' self.base_uri' zostanie przywrócone, nawet w przypadku wyjątku, jest dobrym pomysłem. – nicedawg

1

nie jestem pewien, że to był realizowany, kiedy ta kwestia została po raz pierwszy poprosił, ale jeśli chcesz, aby ustawić lub nadpisać :base_uri na podstawie na żądanie lub per-instancji, HTTParty żądanie metody (: get,: post, etc) accept options, aby zastąpić opcje klasy.

Tak na przykład OP, może to wyglądać mniej więcej tak:

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 

wywołanie metody klasy dynamicznie, jak sugerowano w niektórych innych odpowiedzi, zmienia base_uri dla wszystkich wniosków, co jest prawdopodobnie nie to, co chcesz. Z pewnością nie jest bezpieczna dla wątków.

Powiązane problemy