2017-09-19 66 views
0

將google oauth用於項目。有它的工作,但想拉的個人資料圖片顯示在我的應用程序。一旦我能夠顯示圖片,我退出並試圖用oauth重新登錄。現在告訴我,名稱和電子郵件已被採納。我在我的User模型中使用find_or_create_by來查找或創建oauth證書。我不知道是什麼造成了這個問題,因爲它剛剛在一段時間內工作。而現在,當我回到我的代碼的第一次,這不是工作期。只要給我BC驗證的錯誤(試圖創建一個記錄,而不是在數據庫中找到記錄。)find_or_create_by未找到,僅嘗試創建

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

這條線:

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

系統只考慮UID,供應商和password_digest。但正如你的錯誤說the name and email have already been taken。這意味着在您的用戶數據庫中,兩者都有唯一的約束。因此即使uid和提供者不同,如果它與另一個現有記錄相匹配,也不能在數據庫中保留新實例。

所以,你可以刪除唯一約束或驗證添加到find_or_create_by

+0

如果我拿出模型上的驗證這確實工作。但是,那不是'find_or_create_by'應該做什麼?找到記錄,如果它已經存在,否則創建它? –

+1

find_or_create_by如果找不到與這些屬性相匹配的記錄,然後創建一個新的記錄,那麼在db中找到具有這些屬性的記錄,即 - >()內部的內容。所以你沒有通過電子郵件和名稱,這就是爲什麼find_or_create_by它不在意這 –

+0

這很奇怪,我添加了電子郵件和名稱的論點。當我拿出驗證證書時,它創建了多個記錄。我從參數中刪除了名稱和電子郵件,並重新應用了驗證,現在它可以工作,但現在圖像在視圖中是零,即使它在那裏作爲屬性。大聲笑。感謝您的幫助。肯定會給我更多的玩法:P –

相關問題