解決したいこと
FacebookとGoogleアカウントで同じメールドレスを登録している場合、DBに同じuser_idで登録されてしまうので、別々のidで登録、管理したい。
起こっている問題
例えばFacebookでユーザー登録をし、ログアウト後Googleで登録(Facebookとは同じメールアドレスで登録しているアカウント)で登録すると、先にFacebookで登録したuser_id、その他全ての登録内容を共有してしまっている。Googleアカウントで登録していた名前は存在しなくなっている。
config/routes.rb
ruby
1Rails.application.routes.draw do 2 3 root "items#index" 4 devise_for :users, controllers: { 5 omniauth_callbacks: 'users/omniauth_callbacks', 6 registrations: "users/registrations" 7 } 8 devise_scope :user do 9 get "addresses", to: "users/registrations#new_address" 10 post "addresses", to: "users/registrations#create_address" 11 end 12 13~省略~ 14 15end
registrations_controller.rb
ruby
1class Users::RegistrationsController < Devise::RegistrationsController 2 before_action :configure_sign_up_params, only: [:create] 3 before_action :configure_account_update_params, only: [:update] 4 5 # GET /resource/sign_up 6 def new 7 super 8 end 9 10 # POST /resource 11 def create 12 if params[:sns_auth] == 'true' 13 pass = Devise.friendly_token 14 params[:user][:password] = pass 15 params[:user][:password_confirmation] = pass 16 end 17 @user = User.new(sign_up_params) 18 unless @user.valid? 19 flash.now[:alert] = @user.errors.full_messages 20 render :new and return 21 end 22 session["devise.regist_data"] = {user: @user.attributes} 23 session["devise.regist_data"][:user]["password"] = params[:user][:password] 24 @address = @user.build_address 25 render :new_address 26 end 27 28 def create_address 29 @user = User.new(session["devise.regist_data"]["user"]) 30 @address = Address.new(address_params) 31 unless @address.valid? 32 flash.now[:alert] = @address.errors.full_messages 33 render :new_address and return 34 end 35 @user.build_address(@address.attributes) 36 @user.save! 37 session["devise.regist_data"]["user"].clear 38 sign_in(:user, @user) 39 end 40 41 ~省略~ 42 43end
omniauth_collbacks_controller.rb
ruby
1class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController 2 3 def facebook 4 authorization 5 end 6 7 def google_oauth2 8 authorization 9 end 10 11 def failure 12 redirect_to root_path, alert: '認証に失敗しました。' 13 end 14 15 16 private 17 18 def authorization 19 sns_info = User.from_omniauth(request.env["omniauth.auth"]) 20 @user = sns_info[:user] 21 22 if @user.persisted? #ユーザー情報が登録済なので、新規登録ではなくログイン処理を行う 23 sign_in_and_redirect @user, event: :authentication 24 else #ユーザー情報が未登録なので、新規登録画面へ遷移する 25 @sns_id = sns_info[:sns].id 26 render template: 'devise/registrations/new' 27 end 28 end 29 30end
ご有識のある方、ご助力お願いします。
蛇足な記述等あればそちらもご指摘いただけると幸いです。
あなたの回答
tips
プレビュー