Railsチュートリアル第6章
はじめに
Ruby on Railsチュートリアル(第6版)のメモ、演習の解答例を記述した記事です。
解答は個人のものなので、誤りがあればご指摘ください。
開発環境 Ruby: 2.7.2 , Rails: 6.1.4
メモ
Active Record
データベースとやり取りをするデフォルトのライブラリ
このライブラリのおかげで直接SQL文を書かずにRailsのメソッドでデータベースを操作できる。
(O/Rマッピング)
Active Recordはデータオブジェクトの作成、保存、検索のためのメソッドを持っている。
スキーマ
データベースの構造を追跡するために使われる。
db/schema.rb
モデル
モデルの生成
$ rails generate model モデル名(単数形)
作成したモデルはApplicationRecordを継承している。
ApplicationRecordはActive Recordを継承している。
つまり生成したモデルはActive Recordのメソッドが使える
CRUD
データベースの操作を表す「Create」、「Read」、「Update」、「Delete」の頭文字。
Active RecordはCRUDのメソッドを生成するのでActive Recordを継承したモデルでもこれらのメソッドを利用できる。
例:user.new, user.find, user.update, user.destroy ...
update_attributeメソッドは検証を回避して更新することができる
参考:Active Record の基礎 - Railsガイド
検証
ActiveRecordでは検証(Validation)という機能でモデルの属性に制約を課すことができる。
よく使われるバリデーションヘルパー
・存在性 (presence)
・長さ (length)
・フォーマット (format)
・一意性 (uniqueness)
・確認 (confirmation)
参考:Active Record バリデーション - Railsガイド
有効性の検証
バリデーション機能が正常に動いているかはテストで確かめる
- 有効なモデルのオブジェクトを作成
- 作成したオブジェクトのうちの1つを有効でない属性に意図的に変更する
- バリデーションで失敗するかテストする
- テストが成功するようにモデルにバリデーションを設定する
- テストが成功するか確認する
一意性の検証
モデルの一意性を検証するときにメモリ上だけでなく実際にレコードをデータベースに登録して検証する必要がある。
テスト上で登録したレコードは"db/test.sqlite3"のテスト用のデータベースに保存される。
test "email addresses should be unique" do duplicate_user = @user.dup #dupでオブジェクトを複製 @user.save #db/test.sqlite3のデータベースに登録 assert_not duplicate_user.valid? end
インデックス
通常テーブルの中から特定のカラムを検索するとき、テーブルの上から下まで探したいカラムを闇雲に探す。
このままだと、数千人、数万人が登録されたデータベースから一人を探すのは時間がかかる、
そこでインデックスを使うと早く検索できるらしい、、
indexを追加する
$ rails generate migration add_index_to_テーブル名_カラム名
生成されたmigrationファイルは以下のようになる。
class AddIndexToテーブル名 < ActiveRecord::Migration def change add_index :テーブル名, カラム名[, unique: true ] end end
Railsチュートリアルでは"unique: true"を追加して一意性を強制している。
参考:データベースにindexを張る方法 - Qiita
コールバック
オブジェクトの保存、更新、削除の際に処理を実行させる
コールバックを使う際は慎重に、、、
苦しめられてやっと理解できたRailsコールバックの使い方 - KitchHike Tech Blog
reloadメソッド
現在のデータベースと同じ値に更新する。
user = User.new( name: "user", email: "user@example.com" ) => #<User id: nil, name: "user", email: "user@example.com", created_at: nil, updated_at: nil, password_digest: nil> user.save => true user.name = "hogehoge" => "hogehoge" user.reload.name => "user"
セキュアなパスワード
パスワード、パスワードの確認をユーザーに入力してもらい、そのデータをハッシュ化してデータベースに保存することで安全性を保つ。
ハッシュ化されたパスワードを保存するには
- モデルにpassword_digesカラムを追加する
- ハッシュ関数を導入する(bcrypt)
- モデルでhas_secure_passwordメソッドを呼び出す
has_secure_passwordを呼び出したモデルは以下の機能が使えるようになる
・ハッシュ化したパスワードをpassword_digestに保存できるようになる
・ペアの仮想的な属性であるpasswordとpassword_confirmationが使えるようになる
存在性とpasswordとpassword_confirmationが一致するかどうかのバリデーションも追加される
・authenticateメソッドが使えるようになる
おわりに
6章ではUserテーブルを作りバリデーションの設定、セキュアなパスワードの追加をしました。
has_secure_passwordの力恐るべしです。