読者です 読者をやめる 読者になる 読者になる

49hack

見習いエンジニアが魔法使いになるまで

emailのバリデーションをちょっとだけ工夫する

Userモデルのemailに、存在チェックとフォーマットチェックを入れることを考えます。

必要なgemをインストールしておきます。

# Gemfile
gem 'validates_email_format_of'

普通にやってみる

class User < ActiveRecord::Base
    validates :email, presence: true, email_format: {:with => /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i,:message => 'の形式が不適切です。'}
end

この場合emailが空のときにはエラーが2つ入ってしまいました。

user = User.new
user.valid? #=> false
user.errors[:email] #=> ["を入力してください。", "の形式が不適切です。"]

ちょっと工夫してみる

上記だとなんだかいまいちなので、emailが空のときは存在エラー、フォーマットがおかしいときはフォーマットのエラーだけが入るようにします。

バリデーションを2つに分けて、フォーマットチェックにallow_blankを設定します。

class User < ActiveRecord::Base
    validates :email, presence: true
    validates :email, email_format: {:with => /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i,:message => 'の形式が不適切です。'}, allow_blank: true
end

すると、いい感じのバリデーションになりました。

user = User.new
user.valid? #=> false
user.errors[:email] #=> ["を入力してください。"]

user.email = "hoge"
user.valid? #=> false
user.errors[:email] #=> ["の形式が不適切です。"]

こっちのほうがユーザにとってわかりやすいエラーを表示できそう。

以上です。