はじめに
開発ですぐに忘れそうなことを、簡単に再度調べられるようにするための備忘録です。
やりたいこと
ログイン認証関連のgem、deviseの
メールアドレスのバリデーションを強化したい。
背景
deviseには、メールアドレスとパスワードのバリデーションが簡単に設定できる「validatable」モジュールが実装されているが、メールアドレスのバリデーションがゆるい。
例)
- exam$$ple@gmail.com のような記号が含まれていても通ってしまう
- example@aaaaa のような不正なドメインでも通ってしまう
しかし、パスワードの確認やメールアドレスの一意性は、便利なので、そのままにしたかった。
試した方法
modelに、メールアドレスのフォーマットを指定した。
model/user.rb
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, format: { with: VALID_EMAIL_REGEX }
しかし、この方法では、エラーメッセージが重複して表示されてしまう。
結論
どうやらdeviseの設定ファイルconfig/initializers/devise.rbで、
メールアドレスのバリデーションだけを指定できたみたい。
config/initializers/devise.rb
# Email regex used to validate email formats. It simply asserts that
# one (and only one) @ exists in the given string. This is mainly
# to give user feedback and not to assert the e-mail validity.
config.email_regexp = /\A[^@\s]+@[^@\s]+\z/
これを、指定したい正規表現で書き換えれば、完了。
config/initializers/devise.rb
config.email_regexp = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i