将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
感谢任何帮助,只是没有看到断开连接。
答案 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