Rails Twitter Gem Omniauth

时间:2011-11-12 16:02:35

标签: 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")

这一行抱怨方法更新。

让我对上面的教程感到困惑的是,他们在开始时会生成迁移以将密码存储在身份验证中,但是教程后面的任何内容都没有提到更改任何代码以将秘密写入数据库。 / p>

我的理解是秘密是从存储在会话cookie中的omniauth哈希获得的。我在这里缺少什么?

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 个答案:

答案 0 :(得分:2)

如果您只需要发布到Twitter,那么完全放弃twitter gem可能会更容易。消费者/访问令牌生成需要app id和secret以及用户的访问权限和秘密令牌。我发现这很容易实现,我认为twitter宝石的开销不是必需的。

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