#6章 ユーザーモデルを作成する
##6.1 Model
Webアプリケーションではユーザの個別のデータを保存することが必要である。
Modelはデータの保存する手段を提供してくれる。
##ユーザの検索方法
- idで検索する方法
User.find(id)
- 属性で検索する方法
User.find_by(属性: 属性の値)
- 最初のレコードを取得
User.first
- 全てのレコードを取得
User.all
##レコードの属性の更新及び保存
- 1つの属性のみ更新する場合
user.update_attribute(name:"unio")
- 複数の属性を更新する場合
user.update_attributes(name: "unio", email "tutorial@gmail.com")
※update_attributesでは1つの属性でエラーが出ると全ての更新が失敗する
##6.2 ユーザを検証する
###Validationの種類
- 存在性 presence
- 長さ length
- フォーマット format
- 一意性 uniqueness
- 確認 confirmation
###検証(バリデーション)の記述方法
validates :対象属性, 検証の種類
記述例
class User < ApplicationRecord
validates :name, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
validates :email, presence: true, length: { maximum: 255 },
format: { with: VALID_EMAIL_REGEX }
end
###検証が失敗した場合
errorsオブジェクトが作成される
>> user.errors.full_messages => ["Name can't be blank"]
###正規表現
有効なメールアドレスには決まったルールが存在する。
そのルールに従っていないアドレスを検出してエラーを出せば無効なメールアドレスを登録してしまうことがない。
そのような決まった文字列にルールを与えられるようにするのに便利なのが正規表現。
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
###インデックス
usersテーブルではemail属性に重複するデータが作成されるのを許したくない。
しかし検証(バリデーション)のみでは一意性を完全に保障することはできない。
データべースレベルで一意性を強制するためにはインデックスが必要。
$ rails generate migration add_index_to_users_email
class AddIndexToUsersEmail < ActiveRecord::Migration[5.0]
def change
add_index :users, :email, unique: true
end
end
###パスワードハッシュ化
前提としてgem 'bcrypt'が必要
$ rails generate migration add_password_digest_to_users password_digest:string
あとは has_secure_password
をUserモデルに記述するだけでハッシュ化させられる。