如何防止在我的 Rails 应用程序中创建重复用户?
How do I prevent a duplicate user from getting created in my Rails application?
我正在使用 Rails 4.2.3。我想使用 Google 和 Facebook 在我的系统中验证(和创建)用户。所以我的 app/models/user.rb 文件中有这个……
def self.from_omniauth(auth)
where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
user.provider = auth.provider
user.uid = auth.uid
user.email = auth.info.email
user.name = auth.info.name
user.oauth_token = auth.credentials.token
user.oauth_expires_at = Time.at(auth.credentials.expires_at)
user.save!
end
end
上面的问题是如果我的数据库中已经有一行,如下所示
id | provider | uid | name | oauth_token | oauth_expires_at | created_at | updated_at | email
----+---------------+-----------------------+---------------+-------------+------------------+----------------------------+----------------------------+-------------------------
5 | google-oauth2 | 777711643329020555465 | Dave A | | | 2016-05-10 20:08:59.182744 | 2016-05-10 20:08:59.182744 | myemail@gmail.com
使用 Google 登录并调用上述方法后,将创建具有相同数据的第二行。有谁知道我可以做些什么来调整,如果我的数据库中已经有一行用户,调用上述方法不会创建第二个重复用户。
谢谢,-戴夫
编辑: 这是通过 Google OAuth
登录后数据库的样子
id | provider | uid | name | oauth_token | oauth_expires_at | created_at | updated_at | email
----+---------------+-----------------------+---------------+-----------------------------------------------------------------------------+---------------------+----------------------------+----------------------------+-------------------------
5 | google-oauth2 | 777711643329020555465 | Dave A | | | 2016-05-10 20:08:59.182744 | 2016-05-10 20:08:59.182744 | myemail@gmail.com
7 | google_oauth2 | 777711643329020555465 | D. A. | ya29.CjLeAiJ--FTY1UhMwXdb7yk74hhdCH4O6sz3ewbG8wBNdmRHAJWZ0esoS0yZLp5fXmS60Q | 2016-05-10 21:49:55 | 2016-05-10 20:49:57.277341 | 2016-05-10 20:49:57.277341 | myemail@gmail.com
您不应该使用 save
,如果找不到匹配项,first_or_create
会为您保存它,请参阅 http://apidock.com/rails/ActiveRecord/Relation/first_or_create
所以只需删除这个:
user.save!
我正在使用 Rails 4.2.3。我想使用 Google 和 Facebook 在我的系统中验证(和创建)用户。所以我的 app/models/user.rb 文件中有这个……
def self.from_omniauth(auth)
where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
user.provider = auth.provider
user.uid = auth.uid
user.email = auth.info.email
user.name = auth.info.name
user.oauth_token = auth.credentials.token
user.oauth_expires_at = Time.at(auth.credentials.expires_at)
user.save!
end
end
上面的问题是如果我的数据库中已经有一行,如下所示
id | provider | uid | name | oauth_token | oauth_expires_at | created_at | updated_at | email
----+---------------+-----------------------+---------------+-------------+------------------+----------------------------+----------------------------+-------------------------
5 | google-oauth2 | 777711643329020555465 | Dave A | | | 2016-05-10 20:08:59.182744 | 2016-05-10 20:08:59.182744 | myemail@gmail.com
使用 Google 登录并调用上述方法后,将创建具有相同数据的第二行。有谁知道我可以做些什么来调整,如果我的数据库中已经有一行用户,调用上述方法不会创建第二个重复用户。
谢谢,-戴夫
编辑: 这是通过 Google OAuth
登录后数据库的样子 id | provider | uid | name | oauth_token | oauth_expires_at | created_at | updated_at | email
----+---------------+-----------------------+---------------+-----------------------------------------------------------------------------+---------------------+----------------------------+----------------------------+-------------------------
5 | google-oauth2 | 777711643329020555465 | Dave A | | | 2016-05-10 20:08:59.182744 | 2016-05-10 20:08:59.182744 | myemail@gmail.com
7 | google_oauth2 | 777711643329020555465 | D. A. | ya29.CjLeAiJ--FTY1UhMwXdb7yk74hhdCH4O6sz3ewbG8wBNdmRHAJWZ0esoS0yZLp5fXmS60Q | 2016-05-10 21:49:55 | 2016-05-10 20:49:57.277341 | 2016-05-10 20:49:57.277341 | myemail@gmail.com
您不应该使用 save
,如果找不到匹配项,first_or_create
会为您保存它,请参阅 http://apidock.com/rails/ActiveRecord/Relation/first_or_create
所以只需删除这个:
user.save!