Rails:从 Twitter gem 保存客户端,作者:sferik
Rails: Persist the client from Twitter gem by sferik
我正在使用 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 调用之前实例化客户端是没有意义的。如你所知,推特会在一段时间后限制你。
那么,在整个会话期间坚持 'client' 的最佳方法是什么?
实际上,实例化客户端 100 次并不比实例化一次更多地涉及与 Twitter 的通信;调用网络流量的是客户端的实际 use,因此很重要。但是,你没有错,没有真正的理由每次都重新实例化它。根据您的用例,您有几个选项:
- 使用 Rails 初始值设定项。也就是说,您可以在
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
但是,您的情况可能会有所不同——实例变量缓存仅在对象存在时存在,而对于控制器而言,它仅在一次请求期间存在。您也可以将其缓存到 class 变量中,但这实际上与上面的第一个选项相同。
最终,实例化 Ruby 对象非常便宜,所以我不会太担心它。试图避免实例化对象通常会使您在开发中浪费的时间多于在生产中实际节省的时间(与大多数不成熟的优化一样)。
在初始化程序中初始化 Twitter 客户端时,最好不要在初始化程序中包含访问令牌和访问秘密令牌,因为该值因用户而异。并且在将其初始化为任何本地/实例变量时尝试使用TWITTERCLIENT.dup 因为它会为您的实例创建不同的对象 ID,如果您将使用相同的常量,那么对实例变量的任何更改都会影响常量。
我正在使用 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 调用之前实例化客户端是没有意义的。如你所知,推特会在一段时间后限制你。
那么,在整个会话期间坚持 'client' 的最佳方法是什么?
实际上,实例化客户端 100 次并不比实例化一次更多地涉及与 Twitter 的通信;调用网络流量的是客户端的实际 use,因此很重要。但是,你没有错,没有真正的理由每次都重新实例化它。根据您的用例,您有几个选项:
- 使用 Rails 初始值设定项。也就是说,您可以在
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
但是,您的情况可能会有所不同——实例变量缓存仅在对象存在时存在,而对于控制器而言,它仅在一次请求期间存在。您也可以将其缓存到 class 变量中,但这实际上与上面的第一个选项相同。
最终,实例化 Ruby 对象非常便宜,所以我不会太担心它。试图避免实例化对象通常会使您在开发中浪费的时间多于在生产中实际节省的时间(与大多数不成熟的优化一样)。
在初始化程序中初始化 Twitter 客户端时,最好不要在初始化程序中包含访问令牌和访问秘密令牌,因为该值因用户而异。并且在将其初始化为任何本地/实例变量时尝试使用TWITTERCLIENT.dup 因为它会为您的实例创建不同的对象 ID,如果您将使用相同的常量,那么对实例变量的任何更改都会影响常量。