2016-04-17 9 views
1

Ich fertige gerade eine Rails App an, und alles funktionierte gestern gut, (das meiste davon ist immer noch). Aber jetzt, wenn ich versuche, mich mit Facebook anzumelden, erhalte ich den Fehler NoMethodError undefined method persisted? for nil:NilClass Ich habe keinen Code im omniauth_callbacks_controller oder im Benutzermodell geändert, also verstehe ich nicht, warum das plötzlich passiert.NoMethodError undefinierte Methode `persistent? ' für nil: NilClass bei der Anmeldung bei Facebook durch Omniauth/Devise?

Hier ist der Code in omniauth_callbacks_controller

def self.provides_callback_for(provider) 
class_eval %Q{ 
    def #{provider} 
    @user = User.from_omniauth(env["omniauth.auth"]) 

    if @user.persisted? 
     sign_in_and_redirect @user, event: :authentication 
     set_flash_message(:notice, :success, kind: "#{provider}".capitalize) if is_navigational_format? 
    else 
     session["devise.#{provider}_data"] = env["omniauth.auth"] 
     redirect_to new_user_registration_url 
    end 
    end 
} 
end 

[:twitter, :facebook].each do |provider| 
provides_callback_for provider 
end 

Und in User.rb

def self.from_omniauth(auth) 
identity = Identity.where(provider: auth.provider, uid: auth.uid).first_or_create do |identity| 
    if identity.user == nil 
    user = User.new 
    user.email = auth.info.email || "#{auth.uid}@#{auth.provider}.generated" 
    user.password = Devise.friendly_token[0,20] 
    user.provider = auth.provider 
    if auth.provider == "facebook" 
     user.name = auth.info.name 
     user.username = "FacebookUser" + (1 + rand(1000)).to_s 
    elsif auth.provider == "twitter" 
     user.name = auth.info.name 
     user.username = auth.info.nickname 
    end 
    end 
    identity.user = user 
end 

identity.access_token = auth['credentials']['token'] 
identity.refresh_token = auth['credentials']['refresh_token'] 
identity.expires_at = auth['credentials']['expires_at'] 
identity.timezone = auth['info']['timezone'] 
identity.save 
identity.user 
end 

ich kann nicht herausfinden, warum es gestern funktionierte, aber es ist jetzt nicht. Nichts hat sich verändert! Ich greife immer noch von derselben URL aus darauf zu, ich habe mich nicht mit den API-Einstellungen auf Facebook oder in devise.rb beschäftigt.

Antwort

0

das Problem ist, dass identity.user ist nill. Dies kann passieren, weil der Benutzer nicht gültig ist (nicht in db gespeichert), im Benutzermodell keine Validierungen bestanden hat.
Ich denke, Problem kann in user.email = auth.info.email || "#{auth.uid}@#{auth.provider}.generated" sein - falscher E-Mail-Typ. Sie können etwas wie puts user.errors in dem Block hinzufügen, in dem Sie den Benutzer erstellt haben.

Auch ich verstehe nicht, warum Sie ein Modell - Identität brauchen. Viel einfacher Add Feld Benutzermodell

Hier ist mein Code (es ist Arbeit):

def self.from_omniauth(auth) 
    email = auth.info.email 
    user = User.find_by(email: email) if email 
    user ||= User.create do |user| 
       user.provider= auth.provider 
       user.uid= auth.uid 
       user.email = auth.info.email 
       user.password = Devise.friendly_token[0,20] 
       user.name = auth.info.name 
       user.email ||= "#{auth.uid}_#{auth.uid}@email.com" 
      end 
    end 
Verwandte Themen