2017-09-19 5 views
0

Utiliser google oauth pour un projet. Avait fonctionné, mais voulait tirer l'image de profil à afficher dans mon application. Une fois que j'étais en mesure d'afficher l'image, je me suis déconnecté et j'ai essayé de me reconnecter avec l'oauth. Il me dit maintenant que le nom et le courriel ont déjà été pris. J'utilise un find_or_create_by dans mon modèle User pour trouver ou créer par les informations d'identification oauth. Je ne sais pas ce qui cause cela car il fonctionnait il y a un peu de temps. Et maintenant, quand je reviens à la façon dont mon code a commencé, ce n'est pas la période de travail. Il suffit de me donner les erreurs bc de validations (en essayant de créer un enregistrement au lieu de trouver l'enregistrement dans la base de données.)find_or_create_by ne trouve pas, essaie seulement de créer

sessions#create

def create 
    if params[:provider].present? 
     @user = User.find_or_create_from_auth(request.env['omniauth.auth']) 
     if @user 
     session[:user_id] = @user.id 
     flash[:notice] = "Logged in as #{@user.name}" 
     redirect_to dashboard_path 
     end 

utilisateurs Modèle-

def self.find_or_create_from_auth(auth) 
    find_or_create_by!(provider: auth.provider, uid: auth.uid, password_digest: 'N/A') do |user| 
     user.provider = auth.provider 
     user.uid = auth.uid 
     user.name = auth.info.name 
     user.email = auth.info.email 
     user.address = "123 ABC St" 
     user.password = 'n/a' 
     user.oauth_token = auth.credentials.token 
     user.oauth_expires_at = Time.at(auth.credentials.expires_at) 
     user.save 
    end 
    end 

Appréciez toute aide, juste ne pas voir la déconnexion ici.

Répondre

1

Cette ligne:

find_or_create_by!(provider: auth.provider, uid: auth.uid, password_digest: 'N/A') do |user|

Vous n'envisagent l'uid, fournisseur et password_digest. Mais comme votre erreur dit the name and email have already been taken. Ce qui signifie que dans votre base de données d'utilisateurs vous avez une contrainte unique dans les deux. Ainsi, même lorsque l'uid et le fournisseur sont différents, vous ne pouvez pas conserver une nouvelle instance à DB si elle correspond à un autre enregistrement existant.

Vous pouvez supprimer la contrainte unique ou ajouter que la validation à find_or_create_by

+0

qui fonctionne si je prends les validations sur le modèle. Mais n'est-ce pas ce que 'find_or_create_by' est censé faire? Trouver l'enregistrement s'il existe déjà sinon le créer? –

+1

find_or_create_by trouver un enregistrement à db avec ces attributs, ce qui est à l'intérieur de ->(), s'il ne trouve pas un enregistrement qui correspond à ces attributs, puis en créer un nouveau. Donc vous ne passez pas l'email et le nom, c'est pourquoi find_or_create_by ça ne s'occupe pas de ça –

+0

C'est bizarre, j'ai ajouté l'email et le nom à l'argument. Il était en train de créer plusieurs enregistrements lorsque j'ai sorti les validations. J'ai enlevé le nom et l'email de l'argument et réappliqué les validations et maintenant cela fonctionne, mais maintenant l'image est nulle dans la vue même si elle est là en tant qu'attribut. lol. Merci pour votre aide. Certainement me donne plus à jouer avec: P –