我使用Twitter gem和Devise / Omniauth代表用户执行操作。一切顺利,我可以成功地为人们发推文。然而,感觉有点蠢。
你们是如何坚持Twitter客户端的?即。
client = Twitter::REST::Client.new do |config|
config.consumer_key = Rails.application.secrets.twitter_consumer_key
config.consumer_secret = Rails.application.secrets.twitter_consumer_secret
config.access_token = 'xxxx'
config.access_token_secret = 'xxxx'
end
在我的大脑中,在每次后续API调用之前实例化客户端都没有意义。如你所知,Twitter会在一段时间后限制你。
那么,什么是坚持客户'的最佳方式。整个会议?
答案 0 :(得分:1)
实际上,实例化客户端100次并不涉及与Twitter进行任何更多的通信而不是实例化一次;它是调用网络流量的客户端的实际 use 因此很重要。但是,你没有错,每次都没有真正的理由重新实例化它。根据您的使用情况,您有几种选择:
config/initializers/twitter.rb
中构建客户端实例,并将其分配给全局可访问的内容,例如常量(TwitterClient = Twitter::REST::Client.new do ...
)。如果您的配置永远不会更改,除非您重新部署应用程序,并且 - 重要的是 - 如果Twitter客户端是thread-safe,那么这是唯一的。这通常不是Ruby宝石的有效假设,但如果你在MRI上运行,你可能不需要担心它。在使用twitter客户端的任何对象中,缓存实例。最简单的方法是:
def twitter_client
@twitter_client ||= Twitter::REST::Client.new do ...
end
# ...
def other_method
twitter_client.do_something(foo: "bar")
end
但是,您的里程可能会有所不同 - 实例变量缓存仅在对象执行时才会存在,对于控制器而言,仅在一个请求期间。您也可以将其缓存到类变量中,但这与上面的第一个选项实际上相同。
最终,实例化Ruby对象非常便宜,所以我不会太担心它。试图避免实例化对象通常会让你浪费更多的时间在开发中,而不是实际节省在生产中(就像大多数过早的优化一样)。
答案 1 :(得分:0)
在初始化程序中初始化Twitter客户端时,最好不要在初始化程序中包含访问令牌和访问密钥令牌,因为此值会因用户而异。并且在将其初始化为任何本地/实例变量时,请尝试使用TWITTERCLIENT。 dup因为它会为你的实例创建一个不同的对象ID,如果你使用相同的常量,那么对实例变量的任何改变都会影响常量。