ユーザー登録、編集ページの作成でメールアドレスに一意性を持たせるための処理をメモ。
コードは①→⑤の順で増やして書いている
#行ったこと
①存在性の検証
②フォーマットの検証
③一意性(メールアドレスが他のユーザーと被らないように)の検証
④データベースにemailの索引を持たせて、一意性を検証
⑤データベースに保存する前に小文字にする
###①存在性の検証
class User < ApplicationRecord
validates :email, {presence: true}
end
###②フォーマットの検証
class User < ApplicationRecord
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, {presence: true, , format: { with: VALID_EMAIL_REGEX }}
end
###③一意性(メールアドレスが他のユーザーと被らないように)の検証
class User < ApplicationRecord
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, {presence: true, , format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false }}
end
※uniqueness: { case_sensitive: false }
で、一意性とメールアドレスの大文字・小文字の区別を無くしている
###④データベースにemailの索引を持たせて、一意性を検証
登録者が(クリックの連打などで)二重登録をしてしまった場合、容易に一意性が崩れてしまう場合がある。これを解消するには、データベースにインデックスを作る必要がある。
#####インデックスとは?
インデックスについては、この記事が個人的にはすんなり理解出来た!
https://qiita.com/viptakechan/items/03cb15684fdace0b5bbe
ここでいうインデックスは、インデックス=索引。
調べたい用語が順番通りに整理されていることで、すぐに目的のページにいけるようにしている。
私の頭の中では、本屋さんで本のタイトルの頭文字を「a~z」に分類して、タグ付けで目的のタイトルを見つけやすいようにしているって感じです。
#マイグレーションでインデックスを追加する。
$ rails generate migration add_index_to_users_email
class AddIndexToUsersEmail < ActiveRecord::Migration[5.2]
def change
add_index :users, :email, unique: true
end
end
#最後にmigrationする
$ rails db:migrate
###⑤データベースに保存する前に小文字にする
メールアドレスは大文字・小文字を区別しないので、データベースに登録前に小文字に戻す必要がある
class User < ApplicationRecord
before_save { self.email = email.downcase }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, {presence: true, , format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false }}
end
#参考
・「RailsにおけるValidationの処理をまとめてみた」
http://somethingpg.hatenablog.com/entry/2013/12/23/085210
→こちらは情報は古いので、情報の選別は必要ですが流れは非常にわかりやすかったので参考にさせていただきました。
・「Railsチュートリアル 6章 ユーザーのモデルを作成する まとめ」
http://blog.livedoor.jp/i_nobuyuki/archives/34560997.html
→こちらは1年以内の比較的新しい記事。流れもわかりやすかったです。今度1回Railsチュートリアルじっくりと読んでみます。