2017-08-10 29 views
0

美好的一天,我是新的紅寶石在軌道上。我正在開發一個旅遊應用程序,並且我想提供用facebook登錄的選項。其實我的應用程序工作正常,使用Facebook的註冊,但錯誤發生時,我關閉會議,當我試圖再次登錄Facebook,它顯示'電子郵件已被採取'有人可以幫助嗎?我會感謝你的幫助。omniauth-facebook錯誤電子郵件已被採取

user.rb

class User < ApplicationRecord 

    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable  
    devise :omniauthable, omniauth_providers: [:facebook] 

    has_many :destinations 
    has_many :deals 
    has_many :payments 
    has_many :transactions 
    has_many :questions 
    has_many :comments 

def self.find_or_create_by_omniauth(auth) 
    user = User.find_by(provider: 'provider', uid: ':uid') 

    unless user 
     user = User.create(
      name: auth[:name], 
      last_name: auth[:last_name], 
      nickname: auth[:nickname], 
      email: auth[:email], 
      uid: auth[:uid], 
      provider: auth[:provider], 
      password: Devise.friendly_token[0,20] 
     ) 
    end 
    user 
    end 
end 

的routes.rb

Rails.application.routes.draw do 

devise_for :users, controllers: {omniauth_callbacks: "omniauth_callbacks"} 
end 

omniauth_callbacks_controller.rb

class OmniauthCallbacksController < ApplicationController 
    def facebook 
     auth = request.env["omniauth.auth"] 

     data = { 
      name: auth.info.first_name, 
      last_name: auth.info.last_name, 
      nickname: auth.info.nickname, 
      email: auth.info.email, 
      provider: auth.provider, 
      uid: auth.uid 
     } 

     @user = User.find_or_create_by_omniauth(data) 

     if @user.persisted? 
      sign_in_and_redirect @user, event: :authentication 
     else 
      session[:omniauth_errors] = @user.errors.full_messages.to_sentence unless @user.save 

      session[:omniauth_data] = data 


      redirect_to new_user_registration_url 
     end 
    end 
end 

什麼是缺失?

回答

0

更改以下行

user = User.find_by(provider: 'provider', uid: ':uid') 

user = User.find_by(provider: auth[:provider], uid: auth[:uid]) 

或簡化該方法進一步,使用下面

def self.find_or_create_by_omniauth(auth) # I recommend using a better name for this method instead of find_or_create_by as it looks like query 
    where(provider: auth[:provider], uid: auth[:uid]).first_or_create do |user| 
    name: auth[:name], 
    last_name: auth[:last_name], 
    nickname: auth[:nickname], 
    email: auth[:email], 
    uid: auth[:uid], 
    provider: auth[:provider], 
    password: Devise.friendly_token[0,20] 
    end 
end 
相關問題