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モデルに記述するだけでハッシュ化させられる。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.