おーしまブログ

プログラミングやってます

<Ruby on Rails> 新規登録のpasswordに英数混合のバリデーションをかける

こんにちは、おーしまです。

今回は、新規登録の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: '警告文'

で、指定したフォーマットに当てはまらない時、表示させる警告文を記述できます。



上記の警告文には、

'には英字と数字の両方を含めて設定してください'

しか記述してありませんが、
実際には、
f:id:tomo_bb_aki0118115:20201013224900p:plain

のように警告文の先頭にカラム名が自動で付きます





それでは、  / \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という意味です。+ は連続する文字列です。







すいません、難しすぎてあまりこちらも理解できていませんでした。

とりあえず、一番上のコードを使えば、パスワードに英数字混合のバリデーションをかけることができます。

正規表現は、色々な種類があるので、もっと勉強してみようと思います。


それではまた〜

ここはどこ おれはだれ それに近いものがあんだよ 始めようとした奴らも迷い始めてる 怖がらせないでよ そりゃ甘くはないけど まだまだ 夢見ていい世界なんでしょ {UVERwould「ハイ!問題作」}