2017-09-19 10 views
0

프로젝트에 google oauth 사용. 작동 했었지만 내 앱에 표시 할 프로필 사진을 가져 오려고했습니다. 사진을 표시 할 수있게되면 로그 아웃하고 다시 oauth로 다시 로그인하려고했습니다. 이름과 이메일이 이미 사용되었다는 사실이 나에게 알려졌다. o 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와 공급자가 다르더라도 다른 기존 레코드와 일치하면 DB에 새 인스턴스를 유지할 수 없습니다.

그래서 당신은 고유 제한 조건을 제거하거나 I 모델에 대한 검증을 꺼내 경우 작업을 수행 find_or_create_by

+0

에 그 유효성 검사를 추가 할 수 있습니다. 하지만 'find_or_create_by'가해야 할 일이 아닌가? 이미 존재하는 레코드를 찾거나 그렇지 않으면 레코드를 찾으십시오. –

+1

find_or_create_by 이러한 속성을 가진 db에서 레코드를 찾고, 그 속성과 일치하는 레코드를 찾지 못하면 ->() 안에 무엇이 있는지 확인한 다음 새 속성을 작성하십시오. 그래서 당신은 이메일과 이름을 전달하지 않습니다. 그래서 find_or_create_by는 그것에 대해 신경을 쓰지 않습니다. –

+0

그것은 이상합니다. 나는 이메일과 이름을 인수에 추가했습니다. 검증을 할 때 여러 레코드를 작성했습니다. 나는 인수에서 이름과 전자 메일을 제거하고 유효성을 다시 적용했지만 이제는 작동하지만 이제 이미지가 속성으로 존재하더라도보기에는 아무 것도 표시되지 않습니다. 롤. 도움을 주셔서 감사합니다. 확실히 나와 함께 노는 더 많은 것을 준다 : P –

관련 문제