LoginSignup
50
48

More than 5 years have passed since last update.

【Rails】メールアドレスのバリデーション

Posted at

ユーザー登録、編集ページの作成でメールアドレスに一意性を持たせるための処理をメモ。
コードは①→⑤の順で増やして書いている

行ったこと

①存在性の検証
②フォーマットの検証
③一意性(メールアドレスが他のユーザーと被らないように)の検証
④データベースにemailの索引を持たせて、一意性を検証
⑤データベースに保存する前に小文字にする

①存在性の検証

user.rb
class User < ApplicationRecord

  validates :email, {presence: true}

end

②フォーマットの検証

user.rb
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

③一意性(メールアドレスが他のユーザーと被らないように)の検証

user.rb
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

⑤データベースに保存する前に小文字にする

メールアドレスは大文字・小文字を区別しないので、データベースに登録前に小文字に戻す必要がある

user.rb
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チュートリアルじっくりと読んでみます。

50
48
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
50
48