将 Rails Twitter 客户端初始化程序放入初始化程序中

Putting the Rails Twitter Client initializer in an Initializer

我有一个初始化器twitter.rb:

require 'twitter'

client = Twitter::REST::Client.new(
        {
          :consumer_key       => "",
          :consumer_secret    => "",
          :access_token       => "",
          :access_token_secret=> "",
        }       
    )

然后我希望能够在其他文件中访问这个 'client',比如一个名为 tag.rb 的模型,我可以这样做吗:

    puts client

我建议不要使用 'client' 这个词,因为您将来可能需要其他词,这可能会造成混淆。但最终..你是如此接近。

初始化程序中的客户端代码是 运行,但您无法访问它,因为它已本地化。您需要做的就是让您的客户端全局化,然后在需要时引用全局变量。

因此您的初始化程序变为:

$twitter_client = Twitter::REST::Client.new(
    {
      :consumer_key       => "",
      :consumer_secret    => "",
      :access_token       => "",
      :access_token_secret=> "",
    }       
 )

你对它的调用变为:

$twitter_client.search("#railsiscool")

请帮自己一个大忙,不要过度使用全局变量,它们在大多数 rails 应用程序中意义不大,可能会给您带来问题。

仅供参考,这些凭据应从您的初始化程序中移出并移至环境变量中,例如ENV['TWITTER_ACCESS_TOKEN'] 等..

关于在整个代码中访问客户端,您有几个选项。

  1. 将 Twitter 客户端存储在全局变量中。全局变量通常被认为是一个坏主意。 $twitter_client = Twitter::REST::Client.new(...)

  2. 创建单例class。这可能不是线程安全的。

  3. 使用工厂模式生成新客户端when/where你需要它。例如,

app/services/twitter_api.rb中:

class TwitterAPI
  def client
    @client ||= Twitter::REST::Client.new do |config|
      config.key = ENV['VALUE'] # for each required credential
    end
  end
end

TwitterAPI.new.client.do_something()