#ruby-on-rails #ruby #twitter #omniauth
#ruby-on-rails #ruby #Twitter #omniauth
Вопрос:
У меня возникли проблемы с использованием omniauth и Twitter gem для генерации твитов.
Я использовал это руководство http://blog.assimov.net/post/2358661274/twitter-integration-with-omniauth-and-devise-on-rails-3
и я могу войти в систему с помощью Twitter, сгенерировать аутентификации, но я не могу обновлять твиты.
current_user.twitter.update("My Rails 3 App with Omniauth, Devise and Twitter")
В этой строке содержится жалоба на обновление метода.
Что меня смущает в приведенном выше руководстве, так это то, что в начале они генерируют миграцию для сохранения секрета в аутентификациях, но ни в коем случае позже в руководстве не упоминается об изменении какого-либо кода для записи секрета в базу данных.
Насколько я понимаю, секрет получен из хэша omniauth, который хранится в сеансовом файле cookie. Чего я здесь не понимаю?
def hash_from_omniauth(omniauth)
{
:provider => omniauth['provider'],
:uid => omniauth['uid'],
:token => (omniauth['credentials']['token'] rescue nil),
:secret => (omniauth['credentials']['secret'] rescue nil)
}
end
Итак, кажется, что все работает, кроме создания клиента Twitter, следовательно, нет доступного метода обновления?
current_user.twitter.update("first tweet")
Методом Twitter здесь должно быть создание клиента Twitter
def twitter
debugger
unless @twitter_user
provider = self.authentications.find_by_provider('twitter')
@twitter_user = Twitter::Client.new(:oauth_token => provider.token, :oauth_token_secret => provider.secret )rescue nil
end
@twitter_user
завершение
Извините, я не силен в объяснении проблемы. Любая помощь приветствуется. Спасибо, Я
Комментарии:
1. Используете ли вы Twitter gem для чего-нибудь еще?
Ответ №1:
Если вам нужно публиковать сообщения только в Twitter, возможно, было бы проще полностью отказаться от Twitter gem. Для генерации токена потребителя / доступа требуются идентификатор приложения и секрет, а также токены доступа пользователя и секретные токены. Я обнаружил, что это достаточно просто реализовать, и подумал, что накладные расходы на Twitter gem не нужны.
module User::Social
def self.included(base)
base.instance_eval do
include Rails.application.routes.url_helpers
end
end
def promote_activity(type, profile)
url = short_profile_url(profile, :host => Conf.domain)
tw_client.request(:post, "http://api.twitter.com/1/statuses/update.json", :status => I18n.translate("tweets.#{type}", :profile => profile.to_s, :url => url))
end
def tw_client
@tw_client ||= begin
consumer = OAuth::Consumer.new(Conf.tw_app_id, Conf.tw_secret, :site => 'http://api.twitter.com')
OAuth::AccessToken.from_hash(consumer, {:oauth_token => self.access_token, :oauth_token_secret => self.secret_token})
end
end
end
class User < AR::Base
include User::Social
end
Комментарии:
1. это здорово, но мне интересно, можете ли вы немного прояснить для новичка. 1) Я предполагаю, что мне нужно установить Omniauth gem? 2) Является ли «Conf» сокращением от config? Это то, что я создаю? итак, я должен поместить consumer_key и consumer_secret в конфигурационный файл? какой из них?
2. Прошу прощения за отсутствие ответа — в последнее время я много путешествовал. Conf — это мой класс Settingslogic, который я бы рекомендовал проверить, если вы с ним не знакомы. Вам нужен только Oauth, но поскольку Oauth зависит от Omniauth, вы должны быть настроены.