Railsチュートリアル 第６章＜復習＞

第６章の復習メモです。
個人的に重要と思ったことを書きます。
調べたことや、知っていたことも含めて書きます。


#モデル
##モデルとは
データベースに対して、CRUD操作を行うクラスのこと。
SQLを使わず、Rubyが提供するメソッドを用いて、DB操作できる。

##モデルの生成
`generate model`コマンドで、モデルを生成できる。

```
$ rails generate model User name:string email:string
```

この場合、Userモデルを生成し、
string型のnameカラム、emailカラムを同時に生成している。

モデル名の頭文字は**大文字**とし、**単数形**とする慣習がある。
(コントローラの場合、複数形を使う慣習がある。）

##DBへの反映
`generate model`を実行しただけでは、モデルがDBに反映されていない。
**migrationファイル**を適用する必要がある。
migrationファイルは、`generate model`コマンド実行時に生成される。

マイグレーションファイル

```db/migrate/[timestamp]_create_users.rb
class CreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users do |t|
      t.string :name
      t.string :email

      t.timestamps
    end
  end
end
```

この場合、DBにusersテーブルを作成し、
string型のnameとemailカラム、timestampsカラムを作成する。
主キー（id）は、ここには書かれていないが、自動生成される。

DBに反映するには、以下のコマンドを実行する。

```
$ rails db:migrate
```

反映を取り消したい場合、以下のコマンドを実行する。

```
$ rails db:rollback
```


#モデルのメソッド
最初に書いた通り、SQLを使わず、RubyのメソッドでDB操作できる。

##行の作成

```
user = User.new(name: "Michael Hartl", email: "mhartl@example.com")
```

※DBにInsertするには、後述のuser.saveが必要

##検索

```
user = User.find_by(email: "mhartl@example.com")
```

この場合、emailカラムを検索条件としている

##はじめの一行を抽出

```
user = User.first
```

##全行抽出

```
user = User.all
```

##更新

```
user.email = "foo@bar.com"
```

※DBをUpdateするには、後述のuser.saveが必要

##保存（DBに反映）

```
user.save
```

保存に成功すればtrueを、失敗すればfalseを返す。

##削除（DBからDelete）

```
user.destroy
```


#バリデーション
モデルクラスに、**validatesメソッド**を記述することで、
バリデーションを実装できる。

##存在チェック
validatesメソッドに、**presence**という引数を与えて使う。

```app/models/user.rb
class User < ApplicationRecord
  validates :name, presence: true
end
```

この場合、nameカラムの存在チェックを実装している。

##長さチェック
validatesメソッドに、**length**という引数を与えて使う。

```app/models/user.rb
class User < ApplicationRecord
  validates :name,  presence: true, length: { maximum: 50 }
end
```
この場合、nameカラムの最大文字数を、50文字に設定している。

##フォーマットチェック
validatesメソッドに、**format**という引数を与えて使う。

```app/models/user.rb
class User < ApplicationRecord
  validates :name,  presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
                    format: { with: VALID_EMAIL_REGEX } # ← フォーマットチェック
end
```

この場合、emailカラムについて、VALID_EMAIL_REGEXという変数に
代入したフォーマットに当てはまるかどうか、チェックしている。

##一意性チェック
validatesメソッドに、**uniqueness**という引数を与えて使う。

```app/models/user.rb
class User < ApplicationRecord
  validates :name,  presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
                    format: { with: VALID_EMAIL_REGEX },
                    uniqueness: true # ← 一意性チェック
end
```

この場合、emailカラムの一意性をチェックしている。


#パスワードのハッシュ化
以下を行うことで、パスワードをハッシュ化し、DBに登録できる。

1. モデルクラスに**has_secure_password**を実装する
2. DBに**password_digest**カラムを追加する
3. ハッシュ関数の**bcrypt**をGemfileに追加する

##1. モデルクラスに**has_secure_password**を実装する

```app/models/user.rb
class User < ApplicationRecord
  .
  .
  .
  has_secure_password # ← これを追加する
end
```

##2. DBに**password_digest**カラムを追加する
`generate migration`コマンドでmigrationファイルを作成し、
カラムを追加する。

##3. ハッシュ関数の**bcrypt**をGemfileに追加する

```
gem 'rails',          '5.1.6'
gem 'bcrypt',         '3.1.12' # ← これを追加する
.
.
.
```


#その他
テストについて、詳しめに解説されていますが、
長くなりそうなので、復習メモでは触れないでおきます。