前提・実現したいこと
SNS認証機能をサインアップ画面に実装しているのですが、データをうまく保存させることができません。
SNS認証で初回登録された際に、
Userテーブルの子であるSnsCredentialテーブルに、外部キーのuser_idを除いたデータを格納し、
また、Userテーブルにも返り値のデータが格納されるようにしたい。
その後、再度ログインした時にはSnsCredentialテーブルにuser_idも番号が割り振られる様に設定という流れを実現したいと考えています。
発生している問題・エラーメッセージ
現在、表題の通りで、user_idにdefault値が無いため、エラーになっていますとあります。
モデルにdefault: NULLとしても効果がなく、
使用しているSQLに直接NULL許可を付与すると、SNSCredentialテーブルだけにはデータが保存される様になります
(*これは本番環境には使えない手なので、あくまで実験的に行ったものですが)
どの様な対応が必要なのでしょうか?
該当のソースコード
migration
1 def change 2 create_table :sns_credentials do |t| 3 t.string :provider 4 t.string :uid 5 t.references :user, foreign_key: true 6 end
controller
1 def google_oauth2 2 authorization 3 end 4 ~~~~略~~~~~ 5 private 6 def authorization 7 @user = User.from_omniauth(request.env["omniauth.auth"]) 8 if @user.persisted? 9 ~~~~略~~~~~ 10 end 11 end
SnsCredentialModel
1belongs_to :user, optional: true
UserModel
1 has_many :sns_credentials 2 def self.from_omniauth(auth) 3 sns = SnsCredential.where(provider: auth.provider, uid: auth.uid).first_or_create 4 user = sns.user || User.where(email: auth.info.email).first_or_initialize( 5 nickname: auth.info.name, 6 email: auth.info.email 7 ) 8 if user.persisted? 9 ~~~~~略~~~~~~~ 10 end 11end
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/31 00:19
2020/07/31 00:39