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
Sind Sie sicher @ @details ["info"] ["email"] 'das ist nicht null oder so? – Rashmirathi
Nein. Es muss außerhalb dieser Validierung liegen, damit der Rückruf funktioniert. –
': 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