고유성 검증

2967 단어 email유일성

사용자가 등록할 때 어떻게 사용자의 유일성을 보증합니까
 
예를 들어 rails는 기본적으로 대소문자를 구분하기 때문에 이미 존재할 때[email protected]저장[email protected], 두 개의 다른 이메일, 즉valid?반환된 것은 true이지만 실제 이메일 주소는
대소문자를 구분하지 않습니다.
 
 
$ rails console --sandbox
>> user = User.create(name: "Example User", email: "[email protected]")
>> user.email.upcase
=> "[email protected]"
>> user_with_same_email = user.dup
>> user_with_same_email.email = user.email.upcase
>> user_with_same_email.valid?
=> true

 
 
1. modle 층에서validates는 선택할 수 있는 매개 변수 uniqueness: {case_senstive:false}를 제공합니다
이메일의 대소문자를 구분하지 않음
 
 
class User < ActiveRecord::Base
  .
  .
  .
  validates :email, presence: true,
                    format: { with: VALID_EMAIL_REGEX },
                    uniqueness: { case_sensitive: false }
end

 
만약 방문량이 매우 많을 때, 동시에 등록된 두 사용자의 이메일이 같다면, 발생할 수 있다
이때 데이터베이스 층에도 유일성 제한을 붙여야 한다. 데이터베이스에서email열에 색인을 만들고 색인에 유일성 제한을 붙여야 한다.
 
$ rails generate migration add_index_to_users_email

 
생성된 이전 파일에 다음과 같은 코드를 수동으로 추가해야 합니다. rails가 정의된 템플릿이 없기 때문입니다.
 
class AddIndexToUsersEmail < ActiveRecord::Migration
  def change
    add_index :users, :email, unique: true
  end
end

 
위의 코드는 Rails의 add_index 방법을 호출하여 users 테이블의 email 열을 인덱스합니다.색인 자체가 유일성을 보장할 수 없기 때문에 unique: true 을 지정해야 한다.
 
$ bundle exec rake db:migrate

 
이메일 주소의 유일성을 확보하기 위해서는 데이터베이스에 저장하기 전에 이메일 주소를 전체 소문자 형식으로 바꾸는 수정을 해야 한다. 모든 데이터베이스 어댑터의 인덱스가 대소문자를 구분하는 것이 아니기 때문이다.이를 위해 우리는 콜백 함수(callback)를 사용해야 한다. Active Record 대상의 생명주기의 특정 시간에 호출하는 콜백 함수before_save는 사용자가 데이터베이스에 저장하기 전에 이메일 주소를 전체 소문자 형식으로 강제로 변환하는 것이다
 
class User < ActiveRecord::Base
  attr_accessible :name, :email

  before_save { |user| user.email = email.downcase }
  .
  .
  .
end

 
 

좋은 웹페이지 즐겨찾기