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.
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? –
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 –
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 –