Rails:通过sferik

时间:2015-07-25 18:03:52

标签: ruby-on-rails twitter devise omniauth

我使用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会在一段时间后限制你。

那么,什么是坚持客户'的最佳方式。整个会议?

2 个答案:

答案 0 :(得分:1)

实际上,实例化客户端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
    

    但是,您的里程可能会有所不同 - 实例变量缓存仅在对象执行时才会存在,对于控制器而言,仅在一个请求期间。您也可以将其缓存到类变量中,但这与上面的第一个选项实际上相同。

最终,实例化Ruby对象非常便宜,所以我不会太担心它。试图避免实例化对象通常会让你浪费更多的时间在开发中,而不是实际节省在生产中(就像大多数过早的优化一样)。

答案 1 :(得分:0)

在初始化程序中初始化Twitter客户端时,最好不要在初始化程序中包含访问令牌和访问密钥令牌,因为此值会因用户而异。并且在将其初始化为任何本地/实例变量时,请尝试使用TWITTERCLIENT。 dup因为它会为你的实例创建一个不同的对象ID,如果你使用相同的常量,那么对实例变量的任何改变都会影响常量。