質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.36%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Facebook

Facebookは、実名登録制のSNS(ソーシャル・ネットワーキング・サービス)です。開発者用のデベロッパーサイトが存在し、一般ユーザーによるFacebook向けアプリケーション開発が可能です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

0回答

1235閲覧

omniauth導入によるユーザー登録、ログイン機能の実装

TaaShii

総合スコア5

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Facebook

Facebookは、実名登録制のSNS(ソーシャル・ネットワーキング・サービス)です。開発者用のデベロッパーサイトが存在し、一般ユーザーによるFacebook向けアプリケーション開発が可能です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/06/06 01:28

解決したいこと

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

ご有識のある方、ご助力お願いします。
蛇足な記述等あればそちらもご指摘いただけると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問