2013-05-07 2 views
13

私はomniauth-twitter gemを使って私のレールアプリケーションでTwitterログインを有効にしています。ここに私のコードがある..."omniauth-twitter"メールIDはルビーのレールでTwitterから取り出されていません

gemfile -

gem 'omniauth', '~> 1.1.1' 
gem 'omniauth-twitter' 

routes.rbを -

match '/auth/twitter/callback', to: 'users#twitter_login' 
match 'auth/failure', to: 'static_pages#home' 

User_controller.rb -

 def twitter_login 
     auth = request.env['omniauth.auth'] 
     authentication = Authentication.find_by_provider_and_uid(auth['provider'],auth['uid']) 
     if authentication 
      sign_in authentication.user 
      redirect_to root_url 
     else 
     if(User.where(:email => auth['extra']['raw_info']['email']).exists?) 
      flash[:notice] = "You already have account in ibetter" 
      redirect_to root_url   
     else 
      user = User.new 
      user.apply_omniauth(auth)   
      if user.save(:validate => false)  
       sign_in user   
       flash[:notice] = "Welcome to Ginfy"   
       redirect_to root_url 
      else 
       flash[:error] = "Error while creating a user account. Please try again." 
       redirect_to root_url 
      end 
      end 
     end 
    end 

session_helper.rb -

def sign_in(user) 
    cookies.permanent[:remember_token] = user.remember_token 
    self.current_user = user 
    end 

User.rbモデル -

before_save { |user| user.email = email.downcase } 
    def apply_omniauth(auth) 
    self.email = auth['extra']['raw_info']['email'] 
    self.name = auth['extra']['raw_info']['name'] 
    authentications.build(:provider => auth['provider'], :uid => auth['uid'], :token => auth['credentials']['token']) 
    end 

ERBコード -

<%= link_to image_tag("login-twitter.png", alt: "twitter"), "/auth/twitter",:class => "popup", :"data-width" => "600", :"data-height" => "400" %> 

電子メールIDは、Twitterからのフェッチではありません。助けてください

+0

同様の問題をデバッグするためにpryを使用しました。 'pry' gemを含めてから、あなたのメールIDがtwitterから取得される直前に 'binding.pry'を追加してください。それからあなたはTwitterからの応答を調べて何が起きているのか把握することができます。 http://yorickpeterse.com/articles/debugging-with-pry/をご覧ください。あなたのコメントのために、 –

+0

、 'pry'デバッグ用の素晴らしい宝石をありがとう。 self.email = auth ['extra'] ['raw_info'] ['email'] => nil'' [2] pry(#)> self .name = auth ['extra'] ['raw_info'] ['name'] =>「Ginfy」 ' – SoftwareGeek

+0

[これをチェック](http://stackoverflow.com/questions/3599621/is-there-a-wayユーザーのメールアドレスを確認してからtwitter-identity-us) – SoftwareGeek

答えて

14

TwitterはあなたにAPIを介して電子メールを与えていません。

これはomniauth-facebook gemなどを使用していても動作しますが、twitterでは電子メールは表示されません。回避策を作成する必要があります。

たとえば、2番目の手順でユーザーに電子メールアドレスを入力するように依頼します。

+5

私は "#{twitter_nickname}@example.org"という電子メールを自動収集し、ユーザーが余裕でそれを変更するようにしています。 –

+0

こんにちはトム、私は現在同じ問題を抱えています。電子メールの自動生成方法に関するコードを共有できますか? –

+0

私はbefore_createフックを追加し、電子メールを設定します。 – Mattherick

0

GEMが問題なく動作しています。何らかの理由で、Twitterがありません。異なっていますfacebook ..

+0

Twitter権限を更新してもOmniAuthハッシュの電子メールフィールドを受信して​​いない場合は、余分なパラメータを取得するためにTwitter資格トークンを更新する必要があります。 – ZombieBsAs

4

受け入れられる答えは時代遅れです。 Twitterは今このSpecial Permission Formを介して電子メールを提供しています。特別な権限を要求するフォームに記入し、承認を待ちます。

さらに詳しい情報はthis answerをご覧ください。