2012-12-05 10 views
7

Der Versuch, Facebook-Authentifizierung mit Devise, Omniauth (einschließlich Facebook-Omniauth) auf einer App auf Heroku gehostet. Call to Facebook API funktioniert, aber ich überspringe den Bestätigungsschritt nach dem Rückruf nicht.undefined Methode skip_confirmation! - devise, omniauth

folgte ich dem Github Tutorial auf omniauth: https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview

und auch dies lesen und versuchte zu implementieren: Devise skip_confirmation! not working

Aber ich erhalte den folgenden Fehler in meinem Heroku log:

NoMethodError (undefined method `skip_confirmation!') 

So sieht mein devise.rb aus:

config.omniauth :facebook, "API_KEY", "API_SECRET"  

{:strategy_class => OmniAuth::Strategies::Facebook, 
:scope => 'email, offline_access', :client_options => {:ssl => {:ca_file => '/usr/lib/ssl/certs/ca-certificates.crt'}}} 
Hier

ist mein omniauth_callbacks_controller.rb:

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

    if @user.persisted? 
    sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated 
    set_flash_message(:notice, :success, :kind => "Facebook") if is_navigational_format? 
    else 
    session["devise.facebook_data"] = request.env["omniauth.auth"] 
    redirect_to new_user_registration_url 
    end 
    end 
end 

Hier mein user.rb Modell ist:

def self.find_for_facebook_oauth(auth, signed_in_resource=nil) 
user = User.where(:provider => auth.provider, :uid => auth.uid).first 
unless user 
     user = User.new(name:auth.extra.raw_info.name, 
        provider:auth.provider, 
        uid:auth.uid, 
        email:auth.info.email, 
        password:Devise.friendly_token[0,20], 
        ) 
     user.skip_confirmation! 
     user.save 
    end 
    user 
end 

Vielen Dank für Ihre Hilfe!

+0

Haben Sie das Bestätigungsmodul für den Benutzer? class User rorra

+0

Ich habe dies: __devise: database_authenticatable,: registrierbar, : wiederzuerlangen, so: rememberable,: verfolgbar,: validierbares,: omniauthable__ –

Antwort

16

Also, wenn ich nach rechts (nicht 100% sicher) bin, müssen Sie erklären, dass Ihr Modell das Modul confirmable hat, fügen Sie das confirmable Modul:

devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :omniauthable, :confirmable 

Und stellen Sie sicher, dass Sie die Felder für das bestätigende Modul in Ihrer Benutzer Tabelle, sollten Sie die Felder Confirmation_Token und Confirmed_at haben

Wenn Sie diese Felder nicht haben, überprüfen Sie diese answer, wie Sie sie hinzufügen.

+0

dank Ja viel, ich habe diesen verpasst! Ich habe __confirmable__ user.rb, lief __rails g Migration add_confirmable_to_devise__ und rake db: migrate Jetzt habe ich NoMethodError (nicht definierte Methode 'is_navigational_format '?) Auf OmniauthCallbacksController bekommen. Ich muss herausfinden warum! –

+0

das ist wahrscheinlich Teil Ihres Codes, if_navigational_format? ist nicht Teil der Erfindung. – rorra

+0

In diesem Teil des Codes, wo Sie die set_flash_message haben, verwende ich normalerweise so etwas: flash [: Nachricht] = I18n.t "devise.omniauth_callbacks.success",: kind => "Linkedin"; sign_in (@benutzer); redirect_to after_sign_in_path_for (@user) – rorra

Verwandte Themen