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 :対象属性, 検証の種類
記述例
app/models/user.rb
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"]
正規表現
有効なメールアドレスには決まったルールが存在する。
そのルールに従っていないアドレスを検出してエラーを出せば無効なメールアドレスを登録してしまうことがない。
そのような決まった文字列にルールを与えられるようにするのに便利なのが正規表現。
email属性に関する正規表現の例
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
db/migrate/[timestamp]_add_index_to_users_email.rb
class AddIndexToUsersEmail < ActiveRecord::Migration[5.0]
def change
add_index :users, :email, unique: true
end
end
パスワードハッシュ化
前提としてgem 'bcrypt'が必要
password_digest属性の追加
$ rails generate migration add_password_digest_to_users password_digest:string
あとは has_secure_password
をUserモデルに記述するだけでハッシュ化させられる。