Лучшая практика в Твиттере - контроллер против инициализатора
У меня есть зарегистрированное приложение в Твиттере, и я могу публиковать в своем твиттере. Тем не менее, я могу заставить его работать только тогда, когда я помещаю инициализатор в действие 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