【问题标题】:Twitter gem best practice - controller vs. initializerTwitter gem 最佳实践 - 控制器与初始化器
【发布时间】:2014-10-29 22:31:50
【问题描述】:

我在 Twitter 上有一个已注册的应用程序,可以在我的 Twitter 订阅源上发帖。但是,只有当我将初始化程序放入控制器的创建操作中时,我才能让它工作。

        client = Twitter::REST::Client.new do |config|
          config.consumer_key = ''
          config.consumer_secret = ''
          config.oauth_token = ''
          config.oauth_token_secret = ''
        end

        client.update("Hello World!")

我遵循这篇文章中的建议达到了这一点: Twitter integration rails 4 app

如何通过读取我的配置/初始化程序中的文件来完成这项工作/最佳做法是什么?

【问题讨论】:

    标签: ruby-on-rails twitter-gem


    【解决方案1】:

    所以你有几个选择。一种是将 twitter 客户端分配给初始化程序中的全局变量:

    # config/initializers/twitter.rb
    $twitter = Twitter::REST::Client.new do |config|
      # ... 
    end
    

    然后在别处使用$twitter 全局变量。我倾向于不喜欢使用全局变量,因为它会污染全局命名空间。我的替代方法是在相关类上定义类属性。例如,您可以在ApplicationController 上定义它,尽管我建议创建一个单独的类来处理更复杂的情况。使用ApplicationController 示例,它看起来是这样的:

    # app/controllers/application_controller.rb
    class ApplicationController < ActionController::Base
      class << self
        attr_accessor :twitter
      end
    end
    
    # config/initializers/twitter.rb
    ApplicationController.twitter = Twitter::REST::Client.new do |config|
      # ... 
    end
    

    但是,如果您要使用此方法,我建议您使用单独的类而不是使用应用程序控制器。

    【讨论】:

    • 感谢您的回复。我还是有点困惑。您不喜欢您提出的第一个或第二个选项。有没有更好的解决方案,或者它是少于两个邪恶的解决方案?再次感谢!
    • @brad 第一个解决方案可以正常工作。从功能上讲,它们都是相同的,只是取决于偏好。
    【解决方案2】:

    我可能会做以下事情:

    # app/controllers/application_controller.rb
    
    def twitter_client
    
        Twitter::REST::Client.new do |config|
          config.consumer_key        = ENV["TWITTER_CONSUMER_KEY"]
          config.consumer_secret     = ENV["TWITTER_CONSUMER_SECRET"]
          config.access_token        = ENV["TWITTER_ACCESS_TOKEN"]
          config.access_token_secret = ENV["TWITTER_ACCESS_SECRET"]
        end
    
    end
    

    然后在您的任何其他控制器或视图中,您应该能够使用twitter_client 方法。

    例如,这是一个推文控制器,其中索引操作搜索包含“Foo”的推文并获取其中三个:

    # app/controllers/tweets_controller.rb
    
    def index
    
        @tweets = twitter_client.search("Foo").take(3)
    
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-30
      • 2012-08-12
      • 2018-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多