Pergunta

Estou tentando passar um parâmetro para um login método e quero mudar o uri base com base nesse parâmetro.

Igual a:

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

  ...

O uri base não é definido quando eu o chamo de um método. Como faço para que isso funcione?

Foi útil?

Solução

No HTTParty, base_uri é um método de classe que define um hash de opções interno.Para alterá-lo dinamicamente de dentro do seu método de classe personalizado login você pode simplesmente chamá-lo como um método (sem atribuí-lo como se fosse uma variável).

Por exemplo, alterando seu código acima, isso deve definir base_uri como você espera:

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

Espero que ajude.

Outras dicas

Ainda não posso comentar, então aqui vai uma extensão da resposta de Estanislau Trepat.

Para definir o base_uri para todas as suas chamadas, chame o método de classe correspondente:

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

Se você quiser ter uma forma de enviar apenas algumas chamadas para um URI diferente e evitar erros de estado (esquecer de voltar ao URI original), você pode usar o seguinte auxiliar:

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

Com o auxiliar acima, você pode fazer chamadas específicas para outros URIs como este:

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

Não tenho certeza se foi implementado quando esta pergunta foi feita pela primeira vez, mas se você quiser definir ou substituir :base_uri por solicitação ou por instância, métodos de solicitação HTTParty (:get, :post, etc) aceitar opções para substituir as opções de classe.

Então, para o exemplo do OP, poderia ser algo assim:

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

Chamar o método de classe dinamicamente, conforme sugerido em algumas das outras respostas, altera o base_uri para todos solicitações, o que provavelmente não é o que você deseja.Certamente não é seguro para threads.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top