rails勉強メモ3 ~正規表現とvalidationの話~

正規表現の話

まとめ

文頭一致と文末一致に関して勘違いしていたのでまとめる。
結論は、

  • ^と$は「行」の文頭と文末の一致
  • \Aと\zは「文字列」の文頭と文末の一致
  • railsなどは正規表現を書けるものに複数行が入ることがあるので\Aと\zを使ったほうがいい

具体例

例えば郵便番号を正規表現で判断したい。
郵便番号は3桁の数字-4桁の数字(例: 123-4567)

単純に書くと以下のようになる

しかしこの場合でも一致してしまう。

じゃあ文頭と文末を指定してあげればいい

これで完璧と思いきや、以下のように複数行だとダメ。

[正規表現によるバリデーションでは ^ と $ ではなく \A と \z を使おう | 徳丸浩の日記に書いてありますが、rubyの正規表現にはデフォルトで複数行モードがあるらしく、^と$は「行」の先頭と末尾を指定するので、複数行の値が入ってくる場合はうまく正規表現には引っかかりません。
\Aと\zは「文字列」の先頭と末尾を指定できるのでそれを使いましょう。

なので最初の郵便番号の例で言うと以下のようにすると良いらしいです。

validatonの話

webサービスのvalidationは大きく分けてフロントエンド、アプリケーション、データベースの3つがあります。

フロントエンドの話は一旦おいておいて、アプリケーションとデータベースの話です(今回はrails)。

DBでuniqueの制限をかける

例えばデータベース内であるカラムにuniqueの制限がかかっていたとする。

今回はUserテーブルのnameにuniqueがかかっていると仮定。
今Userレコードが一件あり、nameに太郎が入っている。
その状態でnameが同じUserレコードを作ってみる。

とすると以下のようにMysqlのエラーをmysql2というgemが拾ってくれてActiveRecordのエラーにして返してくれる。

modelでuniqueの制限をかける

今度はアプリケーション側でUser modelにnameのunique制限をかける

この状態で先ほどと同じようにレコードを作成する

そうするとROLLBACKして取り消される

ちなみにnewした段階でvalid?メソッドを使うとvalidationがかかったかどうかが返ってくる

また、validationにひっかかったかどうかはerrorsにアクティブモデル(#みたいな)が入っているのでそれのチェックを行うことでvaidationにかかったかどうかを判断できる

ちなみに今の例だと以下のように内容を見ることが出来る

Modelに対してnewしたあとにrailsの場合はinstance.errorsにエラーの内容が入っている。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク