我使用omniauth-kakao gem通过SNS登录。
然后我成功登录,我得到了SNS的令牌和个人资料。
但是当其他用户(不是我(通过SNS注册时,我遇到了错误
ActiveRecord::RecordNotUnique (PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "index_users_on_email"
这是app/model/user.rb
中的代码,导致错误
def self.find_for_oauth(auth, signed_in_resource = nil)
identity = Identity.find_for_oauth(auth)
user = signed_in_resource ? signed_in_resource : identity.user
if user.nil?
email = auth.info.email
user = User.where(:email => email).first
unless self.where(email: auth.info.email).exists?
if user.nil?
user = User.new(
profile_img: auth.info.image,
password: Devise.friendly_token[0,20]
)
user.save! #Error message said this line is problem
end
end
end
if identity.user != user
identity.user = user
identity.save!
end
user
end
另外,我做了两个模型。User.rb
和Identity.rb
.(Identity.rb 參考 User.rb(
Identity.rb
具有"提供程序(sns(","用户"列。User.rb
有用户信息,SNS列的个人资料。
发生错误时,行已添加到Identity.rb
,并且此行未user_id"用户"列中。(添加了其他内容,仅未添加user_id(
此外,行未添加到User.rb
从不
怎么了??
您是否不应该在下面的代码中将 user 与 user 一起保存email
:
if user.nil?
user = User.new(
profile_img: auth.info.image,
password: Devise.friendly_token[0,20]
)
user.save! #Error message said this line is problem
end
它应该是这样的:
if user.nil?
user = User.new(
profile_img: auth.info.image,
email: email,
password: Devise.friendly_token[0,20]
)
user.save! #Error message said this line is problem
end