以下のような、入力フォームによくある条件でバリデーションかけたいときのメモ
・アカウント名は半角英数記号もしくは以下の記号のみ有効( _ - . )
# バリデーションを自作
def valid_account_name
if account_name !~ /^[a-zA-Z0-9\-_\.]+$/
errors.add(:account_name, "の内容が不正です")
end
end
※1 今回モデルに直書きしていますが、カスタムバリデーションはActiveModel::EachValidatorを継承してカスタムバリデータを実装するほうがいい。
https://railsguides.jp/active_record_validations.html#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%BF
※2 check_account_nameみたいな名前はよく使われるけど、何をチェックしているか実装見ないとわからないので、今回の場合だと「有効なアカウント名」みたいなメソッド名のほうがいい。
正規表現部分解説
メタ文字
( ) [ ] { } . ? + * | \
上記の記号はメタ文字といい、正規表現内で特殊な働きをする。
!~
正規表現のメソッド =~ の否定。マッチが失敗したらtrueを返す。
上記のコードでマッチが失敗したらバリデーションに引っかかるように。
/
/で始まり/で終わっているが、これは正規表現の条件はここからここまでだよという範囲を明示するためのもの。
調べてみると/は何の意味も持たない記号で、実際はどの文字でもいいけど慣習的に「/」を使うことが多いそう。
^
/^だと行頭という意味に。
[^のように[]の中で使うと否定形の意味となる。
$
行末という意味に。
[ ]
いくつかの文字列の中から1文字にマッチさせたいとき[]を使う。
-
ハイフン(-)は文字の範囲を表すメタ文字。
文字クラス内に別の文字クラスを含めることができる。( [a-z[0-9]] は [a-z0-9]と同じ意味を持つ。)
a-z
小文字英字
A-Z
大文字英字
0-9
1桁数字
\
直後の文字を通常文字として扱うと行った文字エスケープの意味を持つ。
メタ文字を文字として利用したいときに使う。
+
繰り返しのメタ文字で、1回以上の意味を持つ。(0回以上だと*)
\A と \z(追記)
上記の正規表現では行頭行末を^と$で記載しているが、Rubyでは \A と \z に置き換えたほうがいい。(エラーは出ないが警告がでる)
以下参考にした記事
https://qrunch.net/@hikey/entries/HZv7DnkeDThTjl5b
正規表現はRubyリファレンスから
https://docs.ruby-lang.org/ja/latest/doc/spec=2fregexp.html