Ruby on rails 通过不查找而只是尝试创建来查找或创建

Ruby on rails 通过不查找而只是尝试创建来查找或创建,ruby-on-rails,activerecord,oauth,oauth-2.0,google-oauth,Ruby On Rails,Activerecord,Oauth,Oauth 2.0,Google Oauth,在项目中使用GoogleOAuth。它工作了,但想把个人资料图片显示在我的应用程序中。一旦我能够显示图片,我就注销并尝试使用oauth重新登录。它现在告诉我,名字和电子邮件已经被记录下来了。我在我的用户模型中使用find_或create_by来查找或创建由oauth提供的凭据。我不知道是什么原因造成的,因为它刚才还在工作。现在,当我回到我的代码最初的状态时,它不是工作期。只是告诉我验证尝试创建记录而不是在数据库中查找记录的错误 会话创建 用户模型- def self.find_or_create

在项目中使用GoogleOAuth。它工作了,但想把个人资料图片显示在我的应用程序中。一旦我能够显示图片,我就注销并尝试使用oauth重新登录。它现在告诉我,名字和电子邮件已经被记录下来了。我在我的用户模型中使用find_或create_by来查找或创建由oauth提供的凭据。我不知道是什么原因造成的,因为它刚才还在工作。现在,当我回到我的代码最初的状态时,它不是工作期。只是告诉我验证尝试创建记录而不是在数据库中查找记录的错误

会话创建

用户模型-

def self.find_or_create_from_auth(auth)
    find_or_create_by!(provider: auth.provider, uid: auth.uid, password_digest: 'N/A') do |user|
      user.provider = auth.provider
      user.uid = auth.uid
      user.name = auth.info.name
      user.email = auth.info.email
      user.address = "123 ABC St"
      user.password = 'n/a'
      user.oauth_token = auth.credentials.token
      user.oauth_expires_at = Time.at(auth.credentials.expires_at)
      user.save
    end
  end
感谢您的帮助,只是没有看到此处的断开连接。

这行:

查找或创建用户!提供者:auth.provider,uid:auth.uid,密码摘要:'N/A'do |用户|

您只考虑uid、提供程序和密码摘要。但正如你的错误所说,姓名和电子邮件已经被记录下来了。这意味着在用户数据库中,这两个方面都有唯一的约束。因此,即使uid和提供程序不同,如果新实例与另一个现有记录匹配,您也无法在DB中持久化它


因此,您可以删除唯一约束或添加该验证以查找或创建,如果我在模型上进行验证,这将起作用。但这不正是“发现”或“创造”应该做的吗?如果记录已经存在,请查找它,否则请创建它?通过在数据库中查找具有这些属性的记录来查找\u或\u create\u,->中的内容,如果未找到与这些属性匹配的记录,请创建一个新记录。所以你没有传递电子邮件和名字,这就是为什么find_或create_不关心这件事,这很奇怪,我在论点中添加了电子邮件和名字。当我进行验证时,它正在创建多个记录。我从参数中删除了名称和电子邮件,并重新应用了验证,现在它可以工作了,但现在图像在视图中为零,即使它作为属性存在。哈哈,谢谢你的帮助。肯定给了我更多的发挥:P
def self.find_or_create_from_auth(auth)
    find_or_create_by!(provider: auth.provider, uid: auth.uid, password_digest: 'N/A') do |user|
      user.provider = auth.provider
      user.uid = auth.uid
      user.name = auth.info.name
      user.email = auth.info.email
      user.address = "123 ABC St"
      user.password = 'n/a'
      user.oauth_token = auth.credentials.token
      user.oauth_expires_at = Time.at(auth.credentials.expires_at)
      user.save
    end
  end