我正在尝试将参数传递给login
方法,我想根据该参数切换基础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没有设置,我该如何让它工作?
答案 0 :(得分:16)
在HTTParty中,base_uri
是类方法,它设置内部选项哈希。要从自定义类方法login
中动态更改它,您只需将其称为方法(不要将其指定为变量)。
例如,更改上面的代码,这应该按照您的预期设置base_uri
:
...
case game_name
when "game1"
# call it as a method
self.base_uri "http://game1"
...
希望它有所帮助。
答案 1 :(得分:8)
我还不能发表评论,所以这是Estanislau Trepat答案的延伸。
要为所有通话设置base_uri
,请调用相应类方法:
self.base_uri "http://api.yourdomain.com"
如果您想要一种方法只发送几个不同的URI 并避免状态错误(忘记切换回原始URI),您可以使用以下帮助程序:
def self.for_uri(uri)
current_uri = self.base_uri
self.base_uri uri
yield
self.base_uri current_uri
end
使用上面的帮助程序,您可以对其他URI进行特定调用,如下所示:
for_uri('https://api.anotheruri.com') do
# your httparty calls to another URI
end
答案 2 :(得分:3)
我不确定它是在第一次提出此问题时实现的,但如果您想在每个请求或每个实例的基础上设置或覆盖:base_uri
,则HTTParty请求方法(: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,这可能不是您想要的。它当然不是线程安全的。