こんにちは、おーしまです。
今回は、新規登録のpasswordに英数混合のバリデーションをかける方法についてです。
詳しく説明すると、
deviseを導入して、passwordにデフォルトでかかっているバリデーションは
「6文字以上」だけなので、それに加えて、
「英語と数字の両方をpasswordに含める」というバリデーションをかける方法です。
コードがこちら
PASSWORD_REGEX = /\A(?=.*?[a-z])(?=.*?[\d])[a-z\d]+\z/i.freeze validates_format_of :password, with: PASSWORD_REGEX, message: 'には英字と数字の両方を含めて設定してください'
PASSWORD_REGEX に /\A(?=.*?[a-z])(?=.*?[\d])[a-z\d]+\z/i を代入しています。
.freezeで外部から変更できないようにしています。
/\A(?=.*?[a-z])(?=.*?[\d])[a-z\d]+\z/ に関しては、下で説明します。
validates_format_of :カラム名
で指定したカラムにバリデーションをかけることができます。
validates_format_of :カラム名,with:フォーマット
でフォーマットの指定した文字に当てはまるようにカラムを制限します。
validates_format_of :カラム名,with:フォーマット, message: '警告文'
で、指定したフォーマットに当てはまらない時、表示させる警告文を記述できます。
上記の警告文には、
'には英字と数字の両方を含めて設定してください'
しか記述してありませんが、
実際には、
のように警告文の先頭にカラム名が自動で付きます。
それでは、 / \A (?= .*?[a-z] )(?= .*?[\d] ) [a-z\d]+ \z /i の部分を詳しく見ていきましょう!
まず / /i は大文字と小文字どちらもOKという意味です。
小文字だけにしたければ、i は必要ありません。
次に \A は最初の文字列で、\z は最後の文字列という意味です。
文字数を指定して、「先頭から(末尾から)何文字」という意味にできますが、今回は文字数を指定していないので、「先頭から(末尾から)0文字以上の文字列」になります。
次に例で P(?= G ) は、Pの次にGが続くとOKという意味です。
たぶん。。
次に .*?[a-z] は、簡単にいうと、aからzまで全てOKという意味です。
つまり、\A(?=.*?[a-z]) で先頭の文字はaからzまでOKという意味だと思います。
間違っていたらごめんなさい。
さらに、\A(?=.*?[a-z])(?=.*?[\d]) で \d は数字という意味で、先頭の文字はaからzまたは数字もOKという意味ですね。きっと。
[a-z\d]+\z は、末尾が英数字の1回以上の連続する文字列ならOKという意味です。+ は連続する文字列です。
すいません、難しすぎてあまりこちらも理解できていませんでした。
とりあえず、一番上のコードを使えば、パスワードに英数字混合のバリデーションをかけることができます。
正規表現は、色々な種類があるので、もっと勉強してみようと思います。
それではまた〜