프로젝트에 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
어떤 도움을 주셔서 감사합니다, 여기에 연결이 끊어지는 걸 보지 마세요.
에 그 유효성 검사를 추가 할 수 있습니다. 하지만 'find_or_create_by'가해야 할 일이 아닌가? 이미 존재하는 레코드를 찾거나 그렇지 않으면 레코드를 찾으십시오. –
find_or_create_by 이러한 속성을 가진 db에서 레코드를 찾고, 그 속성과 일치하는 레코드를 찾지 못하면 ->() 안에 무엇이 있는지 확인한 다음 새 속성을 작성하십시오. 그래서 당신은 이메일과 이름을 전달하지 않습니다. 그래서 find_or_create_by는 그것에 대해 신경을 쓰지 않습니다. –
그것은 이상합니다. 나는 이메일과 이름을 인수에 추가했습니다. 검증을 할 때 여러 레코드를 작성했습니다. 나는 인수에서 이름과 전자 메일을 제거하고 유효성을 다시 적용했지만 이제는 작동하지만 이제 이미지가 속성으로 존재하더라도보기에는 아무 것도 표시되지 않습니다. 롤. 도움을 주셔서 감사합니다. 확실히 나와 함께 노는 더 많은 것을 준다 : P –