Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- User.rb
- class User < ApplicationRecord
- include Storext.model
- devise :database_authenticatable, :registerable, :omniauthable,
- :recoverable, :rememberable, :trackable, :validatable
- validates :first_name, :last_name, :email, :experience_level,
- :goal_level, :theoretical_learner_level, presence: true
- mount_uploader :avatar, AvatarUploader
- # Override devise method for Oauth
- def self.new_with_session(params, session)
- if session['devise.user_attributes']
- new(session['devise.user_attributes'].merge(session[:user_attributes])) do |user|
- user.attributes = params
- user.valid?
- end
- else
- super
- end
- end
- def self.from_omniauth(auth)
- where(auth.slice(:provider, :uid).to_hash).first_or_create do |user|
- OauthUserGenerator.new(user: user, auth: auth).generate
- end
- end
- # If sign in through Oauth, don't require password
- def password_required?
- super && provider.blank?
- end
- # Don't require update with password if Oauth
- def update_with_password(params, *options)
- if encrypted_password.blank?
- update_attributes(params, *options)
- else
- super
- end
- end
- end
- oauth_user_generator.rb
- class OauthUserGenerator
- def initialize(user:, auth:)
- @user = user
- @auth = auth
- end
- def generate
- @user.provider = @auth.provider
- @user.uid = @auth.uid
- @user.email = @auth.info.email
- @user.password = Devise.friendly_token[0, 20]
- @user.first_name = @auth.info.name.split[0]
- @user.last_name = @auth.info.name.split[1]
- @user.remote_avatar_url = @auth.info.image
- end
- end
- omniauth_callbacks_controller.rb
- class OmniauthCallbacksController < Devise::OmniauthCallbacksController
- def omniauth_providers
- process_oauth(request.env['omniauth.auth'].merge(session.fetch(:user_attributes, {})))
- end
- alias facebook omniauth_providers
- alias github omniauth_providers
- private
- def process_oauth(omniauth_params)
- user = User.from_omniauth(omniauth_params)
- if user.persisted?
- flash.notice = 'Signed in!'
- sign_in_and_redirect user
- else
- session['devise.user_attributes'] = user.attributes
- redirect_to new_user_email_registration_path
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement