2013-07-10 2 views
2

Я работаю с OmniAuth с Rails и пытаюсь получить Twitter, Facebook и Google подключил для проверки подлинности, но продолжаю работать в эту ошибку:Rails - Создание электронной почты, когда один не существует с интеграцией OmniAuth

PG::Error: ERROR: duplicate key value violates unique constraint "index_users_on_email" 
DETAIL: Key (email)=() already exists. 

Вот мой Authentication контроллер:

class AuthorizationsController < ApplicationController 


     def create 
     authentication = Authorization.find_by_provider_and_uid(auth['provider'], auth['uid']) 

     if authentication 
      flash[:notice] = "Signed In Successfully" 
      sign_in authentication.user, event: :authentication 
      redirect_to root_path 
     else 
      athlete = Athlete.new 
      athlete.apply_omniauth(auth) 

      debugger 

      if athlete.save(validate: false) 
      flash[:notice] = "Account created and signed in successfully" 
      sign_in athlete, event: :authentication 
      redirect_to finalize_profile_path 
      else 
      flash[:error] = "An error has occurred. Please try again." 
      redirect_to root_path 
      end 
     end 
     end 

     def failure 
     render json: params.to_json 
     end 

     private 

     def auth 
      request.env["omniauth.auth"] 
     end 

     def resource(user_type) 
      user_type.downcase.to_sym 
     end 

    end 

Я думаю, что происходит в том, что, когда спортсмен будет создан, он создает один с пустым адресом электронной почты и уникальный ключ не удается ... как я мог бы обойти эту проблему ? Я думаю, что я знаю, как это исправить для интеграции Google, но поскольку Twitter не возвращает письмо, этот вопрос не будет решать сам

ответ

1

Это, как я был в состоянии заставить его работать:

class AuthorizationsController < ApplicationController 

    def create 
    authentication = Authorization.find_by_provider_and_uid(auth['provider'], auth['uid']) 

    if authentication 
     flash[:notice] = "Signed In Successfully" 
     sign_in authentication.user, event: :authentication 
     redirect_to root_path 
    else 
     athlete = Athlete.new(email: generate_auth_email(params[:provider])) 
     athlete.apply_omniauth(auth) 

     debugger 

     if athlete.save(validate: false) 
     flash[:notice] = "Account created and signed in successfully" 
     sign_in athlete, event: :authentication 
     redirect_to finalize_profile_path 
     else 
     flash[:error] = "An error has occurred. Please try again." 
     redirect_to root_path 
     end 
    end 
    end 

    def failure 
    render json: params.to_json 
    end 

    private 

    def auth 
     request.env["omniauth.auth"] 
    end 

    def resource(user_type) 
     user_type.downcase.to_sym 
    end 

    def generate_auth_email(provider) 
     return auth.info.try(:email) unless provider == "twitter" 
     return "#{auth.uid}@twitter.com" if provider == "twitter" 
    end 

end 

I создать электронную почту с помощью щебета UID с twitter.com является доменом, так как щебет не возвращает адрес электронной почты,

Надеется, что это помогает кто-то в будущем

+0

это хорошо. Но гораздо сложнее, чем нужно. Вы могли бы просто сделать что-то вроде: 'user.email = auth.info.email =" #{auth.uid}@twitter.com "' –