頑張ったり頑張らなかったりこの広告は、90日以上更新していないブログに表示しています。プログラミングほんとはもうとっくに終わっているのですが・・・第6章いきます。Softcover.ioやったことモデルの作成とマイグレーションActiveReocordの使用。email:stringUserモデルを作る。:email属性を持つ。"noriyo.akita@gmail.com")find_by_xxxなどの動的ファインダーメソッドは非推奨になっている。"xxx")などの形で使用すること。Dude")カンマ区切り。Dude")これダメ。validationsActiveRecordの方でバリデーションしても、データベースレベルではしてくれない。なると2クリック問題?が起こる。チュートリアル1.アリスはサンプルアプリケーションにユーザー登録します。メールアドレスはalice@wonderland.comです。素早く2回クリックしてしまいます。そのためリクエストが2つ連続で送信されます。3.次のようなことが順に発生します。リクエスト1は、検証にパスするユーザーをメモリー上に作成します。リクエスト2でも同じことが起きます。リクエスト1のユーザーが保存され、リクエスト2のユーザーも保存されます。4.この結果、一意性の検証が行われているにもかかわらず、同じメールアドレスを持つ2つのユーザーレコードが作成されてしまいます。上のシナリオが信じがたいもののように思えるかもしれませんが、どうか信じてください。RailsのWebサイトでは、トラフィックが多いときにこのような問題が発生する可能性があるのです。解決策の実装は簡単です。実は、この問題はデータベースレベルでも一意性を強制するだけで解決します。具体的には、emailカラムにデータベースのインデックスを作成し、そのインデックスが一意であることを要求します。endendadd_indexメソッドでusersテーブルのemailカラムにunique制約そしてモデルではDBに保存する前に小文字にしてしまおうと。before_saveを使う。side:右辺においてselfはオプショナルなので、別につけなくても良い。tableにpassword_digestカラムを追加。なると、password,password_confirmationという2つの属性が必要になる。endsetupメソッドで定義しているUser.newに追加。lengthパスワードの最低限の長さを決めないと。endpasswordとpassword_confimationが一致していて、なおかつ5文字しかないよと。それでは通らないよね、というテストメソッドを定義。}パスワードは最低6文字だよ、というバリデーションをUserモデルに定義。"foobar")実際にユーザーを作成。"$2a$10$YmQTuuDNOszvu5yi7auOC.F4G//FGhyQSWCpghqRWQWITUYlG3XVy"password_digestが生成されているのが確認できる。truetrueかどうかだけを確認したいなら、!!が使える。herokuにpushしてあとはマイグレートする。herokuコンソールに入って確認してみる。endそしてemailを小文字にしたものとDBから再取得したemail(@user.reload.email)がイコールであるかをasser_equalでチェック。小文字でDBに保存されているかどうか。その確認のためには一旦saveしてからの>reloadによる再取得、という流れUserモデルのbefore_saveを一旦コメントアウトしてみる。before_saveを復活させるとテスト通る。保存する前に小文字に変換してますよ、ということで。DBからレコードを再取得する。email属性を直接小文字にしてしまう。dotsfoo@bar..comのようにドットが2つ続いてるのはいけない。/\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/iドットの後には必ず文字が入ってないといけない。