6章開始:User モデルの作成

```
$ rails generate model User name:string email:string
```
モデルを作成したので、DBに反映させるためのmigrate

```
$ bundle exec rake db:migrate
```
Userモデルのspecを記述

```
$ vim spec/models/user_spec.rb
$ bundle exec rspec spec/models/user_spec.rb
(成功)
```
RSpecについて、subject + should と expect についてのメモ

```
$ vim README.md
```
モデルのテストを書いてそれを通すように処理(主にvalidates, presence)

```
$ vim spec/models/user_spec.rb
$ bundle exec rspec spec/models/user_spec.rb
(失敗)
$ vim app/models/user.rb
$ bundle exec rspec spec/models/user_spec.rb
(成功)
```

リスト 6.4 くらいから 6.9
Userモデルのnameの長さ検証のテストを書いて、それを通すようにする

```
$ vim spec/models/user_spec.rb
$ vim app/models/user.rb
$ bundle exec rspec
(成功)
```
emailのフォーマットのテスト

```
$ vim spec/models/user_spec.rb
$ bundle exec rspec
(失敗)
$ vim app/models/user.rb
$ bundle exec rspec
(成功)
```

リスト 6.14くらいまで
重複するメールアドレスを禁止していることを確認するテストと実装

```
$ vim app/models/user.rb
$ vim spec/models/user_spec.rb
```

リスト6.15,16あたり
メールアドレスが大文字章文字を無視した一意性の検証

```
$ vim spec/models/user_spec.rb
$ vim app/models/user.rb
```

リスト6.18あたり
emailインデックスを追加するために migrationファイルを作成し、migrate

```
$ rails generate migration add_index_to_users_email
$ vim 20140417092251_add_index_to_users_email.rb
$ bundle exec rake db:migrate
$ bundle exec rake db:test:prepare
$ vim app/models/user.rb
```

```
User.saveの時に、emailカラムの大文字を小文字に変えてsave
```

以下の流れがありえるのでemailインデックスを追加する

1. アリスはサンプルアプリケーションにユーザー登録します。
  メールアドレスはalice@wonderland.comです。

2. アリスは誤って "Submit" を素早く2回クリックしてしまいます。そのためリクエストが2つ連続で送信されます。

3. 次のようなことが順に発生します。リクエスト1は、検証にパスするユーザーをメモリー上に作成します。リクエスト2でも同じことが起きます。リクエスト1のユーザーが保存され、リクエスト2のユーザーも保存されます。

4. この結果、一意性の検証が行われているにもかかわらず、同じメールアドレスを持つ2つのユーザーレコードが作成されてしまいます。
セキュアなパスワードのために、最新のbcryptのgemを追加

```
$ vim Gemfile
$ bundle install
```
password_digestカラムが存在するかのテストを書き、通るようにmigrationファイルを作成、migrate

```
$ vim spec/models/user_spec.rb
$ bundle exec rspec
(失敗)
$ add_password_digest_to_users password_digest:string
$ bundle exec rake db:migrate
$ bundle exec rake db:test:prepare
$ bundle exec rspec
(成功)
```
Userにセキュアなパスワードを持たせる

```
$ vim spec/models/user_spec.rb
$ vim app/models/user.rb
```

実際にpassword, password_confirmation属性(カラム)があるわけではない(db/scheme.rb見ればわかる)
Userモデルの方にhas_secure_passwordという1行を入れるだけで色々通るようになる
テストうどう開発用にhas_secure_passwordをコメントアウトしておく(わざと)
ユーザがセキュアなパスワードを持っている、パスワードの長さの検証など

```
$ vim spec/models/user_spec.rb
$ vim app/models/user.rb
```

has_secure_passwordという1行が強すぎる
password_digestというカラムを追加するという制約でやばい

リスト 6.29 あたり
(演習6.5.1) メールアドレスを小文字に変換するコードに対するテスト

```
$ vim spec/models/user_spec.rb
$ bundle exec rspec
(成功)
```
(演習6.5.3)ドットが2つ以上続いたメールアドレスが通ってしまうので、通らないようテストと実装

```
$ vim spec/models/user_spec.rb
$ bundle exec rspec
(失敗)
$ vim app/models/user.rb
$ bundle exec rspec
(成功)
```

正規表現!!
リスト6.32
デバッグ用の情報を開発環境(development)にだけ表示する

```
$ vim app/views/layouts/application.html.erb
$ vim app/assets/stylesheets/custom.css.scss
```

3つの環境がある
 * test
 * development
 * production
users/show/[id] のtestと実装, FactoryGirlも使用

```
$ vim Gemfile
$ bundle install
(FactoryGirlの導入)
$ vim spec/factories.rb
$ vim spec/requests/user_pages_spec.rb
$ vim config/routes.rb
$ vim app/views/users/show.html.erb
$ vim app/controllers/users_controller.rb
$ bundle exec rspec
(成功)
```
BCryptのコストファクターをテスト環境向けに再定義する。

遅いのは
BCryptアルゴリズムによるセキュアパスワードのハッシュ生成そのものが仕様上遅いのが原因