2016-04-22 12 views
1

Beim Versuch, Omniahuth-twitter in meine Rails App zu implementieren, habe ich den oben angegebenen Fehler gefunden. Der Fehler konzentriert sich auf eine Aussage in meinem Controller und ich verstehe, dass es sich auf die Tatsache bezieht, dass Twitter keine E-Mail beim Rückruf bereitstellt. Ich verwende ein Gerät zur Authentifizierung. Ich beabsichtige auch, Facebook Omniauth zu installieren, möchte aber Twitter zuerst arbeiten lassen. Welchen Codeblock kann ich implementieren, um diese Validierung für Twitter zu überspringen? Geht es in meinem Controller oder Benutzermodell?ActiveRecord :: RecordInvalid in OmniahuthCallbacksController # twitter Validierung fehlgeschlagen: E-Mail darf nicht leer sein

Hier ist mein Code, wie es steht -

OmniauthCallbacksController -

class OmniauthCallbacksController < Devise::OmniauthCallbacksController 

def twitter 

    @details = request.env["omniauth.auth"] 

    @provider = @details["provider"] 
    @provider_id = @details["uid"] 

    @user = User.where(provider: @provider, provider_id: @provider_id).first 

    if @user.present? 
     #sign them in 
    else 
     # make a new user 
     @user = User.new 
     @user.provider = @provider 
     @user.provider_id = @provider_id 

     # because of has_secure_password - will this work? 
     @user.password = "AAAAAA!!" 
     @user.password_confirmation = "AAAAAA!!" 

     # let's save the key and secret 
     @user.key = @details["credentials"]["token"] 
     @user.secret = @details["credentials"]["secret"] 

     # lets fill in their details 
     @user.name = @details["info"]["name"] 
     @user.email = @details["info"]["email"] 

     @user.save! 
    end 


     session[:uid] = @user.id 
     flash[:success] = "You've logged in" 
     redirect_to root_path 

end 

def password_required? 
    super && provider.blank? 
end 






end 

routes.rb

Rails.application.routes.draw do 

    #get "/auth/:provider/callback" => "social_logins#create" 


    devise_for :users, :controllers => { omniauth_callbacks:  "omniauth_callbacks", registrations: 'registrations' } 



    resources :users 
    resources :events do 

    resources :bookings 
    end 
    # get 'welcome/index' 


    authenticated :user do 
    root 'events#index', as: "authenticated_root" 
    end 


    root 'welcome#index' 




end 

User.rb

class User < ActiveRecord::Base 

    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable, :omniauthable,  omniauth_providers: [:twitter] 

     has_many :events 
     has_many :bookings 
     has_many :authentications 




end 
+0

Sind Sie sicher @ @details ["info"] ["email"] 'das ist nicht null oder so? – Rashmirathi

+0

Nein. Es muss außerhalb dieser Validierung liegen, damit der Rückruf funktioniert. –

+0

': validatable' ist das, was das Vorhandensein von' email' validiert. So könnten Sie '' validatable' 'und Ihre eigenen Validierungen entfernen. Sehen Sie hier https://github.com/plataformatec/devise/blob/master/lib/devise/models/validatable.rb – Rashmirathi

Antwort

0

ich die Antwort mit dieser gefunden Linie von Co de im OmniauthCallbackController

# lets fill in their details 
     @user.name = @details["info"]["name"] 
     if @provider == "twitter"? @user.save!(:validate => false) : @user.save! 
     # the above if statement allows for twitter to skip validation which requires an email 
     @user.email = @details["info"]["email"] 
     end 

     @user.save! 
Verwandte Themen