LoginSignup
1
0

More than 5 years have passed since last update.

RailsTutorial 6章 メモ

Last updated at Posted at 2018-03-18

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0