find_or_create_by没有找到,只是试图创建

时间:2017-09-19 23:35:27

标签: ruby-on-rails activerecord oauth oauth-2.0 google-oauth2

将google oauth用于项目。如果它工作,但想拉动配置文件图片显示在我的应用程序中。一旦我能够显示图片,我就退出并尝试重新使用oauth。它现在告诉我,已经采取了名称和电子邮件。我在find_or_create_by模型中使用User来查找或创建oauth凭据。我不知道是什么导致了这一点,因为它刚刚开始工作。现在,当我回到我的代码的第一个时代时,它不是工作期。只是给我验证的错误(尝试创建记录而不是在数据库中查找记录。)

sessions#create

def create
    if params[:provider].present?
      @user = User.find_or_create_from_auth(request.env['omniauth.auth'])
      if @user
        session[:user_id] = @user.id
        flash[:notice] = "Logged in as #{@user.name}"
        redirect_to dashboard_path
      end

用户模型 -

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

感谢任何帮助,只是没有看到断开连接。

1 个答案:

答案 0 :(得分:1)

这一行:

find_or_create_by!(provider: auth.provider, uid: auth.uid, password_digest: 'N/A') do |user|

您只考虑了uid,provider和password_digest。但正如您的错误所示the name and email have already been taken。这意味着在您的用户数据库中,您在两者中都有一个唯一约束。因此,即使uid和提供程序不同,如果它与另一个现有记录匹配,也无法在DB上保留新实例。

因此,您可以删除唯一约束或将该验证添加到find_or_create_by