Лучшая практика в Твиттере - контроллер против инициализатора

У меня есть зарегистрированное приложение в Твиттере, и я могу публиковать в своем твиттере. Тем не менее, я могу заставить его работать только тогда, когда я помещаю инициализатор в действие create моего контроллера.

        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 4

Как мне заставить это работать, прочитав файл в моей конфигурации / инициализаторах / какой будет лучшая практика?

2 ответа

Итак, у вас есть несколько вариантов. Один из них - назначить клиенту 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

Но опять же, я бы порекомендовал иметь отдельный класс вместо использования контроллера приложений, если вы собираетесь использовать этот метод.

Я потенциально мог бы просто сделать следующее:

# 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 метод.

Например, вот контроллер твитов, где действие index ищет твиты, содержащие "Foo", и принимает три из них:

# app/controllers/tweets_controller.rb

def index

    @tweets = twitter_client.search("Foo").take(3)

end
Другие вопросы по тегам