2017-05-24 2 views
1

Error Message PictureOmniauth ne fonctionne pas: méthode non définie `persisted? ' pour nil: NilClass

J'ai fondamentalement suivi les instructions du lien ci-dessous EXACTEMENT et je reçois cette foutue erreur? Je n'ai aucune idée de ce que je suis censé faire, wtf? Ai-je besoin de créer une sorte de méthode persistante ?? Il y avait plusieurs autres questions comme celle-ci et après avoir lu tous, ils n'étaient pas serviables à tous. S'il vous plaît aider.

https://github.com/zquestz/omniauth-google-oauth2

Omniauths Contrôleur

class OmniauthCallbacksController < Devise::OmniauthCallbacksController 
    def google_oauth2 
    # You need to implement the method below in your model (e.g. app/models/user.rb) 
    @user = User.from_omniauth(request.env["omniauth.auth"]) 

    if @user.persisted? 
    flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Google" 
    sign_in_and_redirect @user, :event => :authentication 
    else 
    session["devise.google_data"] = request.env["omniauth.auth"].except(:extra) #Removing extra as it can overflow some session stores 
    redirect_to new_user_registration_url, alert: @user.errors.full_messages.join("\n") 
    end 
    end 
end 

code du modèle utilisateur extrait

def self.from_omniauth(access_token) 
data = access_token.info 
user = User.where(:email => data["email"]).first 
# Uncomment the section below if you want users to be created if they don't exist 
# unless user 
#  user = User.create(name: data["name"], 
#  email: data["email"], 
#  password: Devise.friendly_token[0,20] 
# ) 
# end 
    user 
end 

Répondre

1

changé la partie inférieure à:

def self.from_omniauth(auth) 
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user| 
    user.email = auth.info.email 
    user.password = Devise.friendly_token[0,20] 
    user.name = auth.info.name # assuming the user model has a name 
end 
end 

couru r ails g migration Fournisseur AddOmniauthToUsers: string uid: string

Puis il est allé à authentifié avec succès par le compte Google.

Donc, je crois que cela fonctionne maintenant. Je pense que le problème était peut-être que je devais ajouter le fournisseur et l'uid au modèle de base de données utilisateur?