Railsチュートリアルの続きです。前回はBootstrapやSassを使ったCSS設定、リンクのルーティング設定などを行いました。今回はユーザーのモデルの作成を行います。それではいきましょう!
【目次】
- devise(今回は使わない)
- モデルとは
- モデルの生成
- マイグレーション
- モデルファイル
- いろいろなメソッド
- ユーザーオブジェクトを更新
- ユーザーを検証
- インデックス追加
- セキュアなパスワードを追加
- ユーザーの作成と認証
- 本番環境でUserモデルを使う
- 終わりに
Ruby/Ruby on Railsを習得するためにやったこと まとめ
qiita.com
devise(今回は使わない)
railsでは「devise」という認証システムを使うのが定番のようだが、Railsチュートリアルではこれをあえて使わずに自作するとのこと。
※参考:GitHub - heartcombo/devise: Flexible authentication solution for Rails with Warden.
モデルとは
- モデル(Model):データモデルとして扱うデフォルトのデータ構造
- Active Record:データベースとやりとりするライブラリ
- マイグレーション(Migration):データの定義をRailsに記述する
- 4章で作ったUserモデルには永続性の要素がなかった(このファイルは削除した)
- リレーショナルデータベース(RDB):データ行とカラム(列)で構成されるテーブル
モデルの生成
モデルを生成するコマンド
$ rails generate model User name:string email:string
generate modelを使う- モデル名は
User name、emailという属性を作る(属性には型情報も渡している)- コマンドを実行すると複数のファイルが生成される
マイグレーション
db/migrate/[timestamp]_create_users.rbにUserモデルのマイグレーションが生成される- ファイル名にタイムスタンプが付く
- マイグレーション:データベースに与える変更を定義したchangeメソッドの集まり
$ rails db:migrateコマンドでマイグレーションの適用(migrating up)db/development.sqlite3というファイルが作られる- DB Browser for SQLiteでファイルを開くとDBの構造が見られる
モデルファイル
app/models/user.rbのUserモデルはApplicationRecordを継承している$ rails console --sandboxを実行:コンソールをサンドボックスモードで起動- サンドボックスモードで行った処理は終了時にすべてロールバック(取り消し)される
User.new実行:id、emailなど中身が表示される(値は空)user = User.new(name: "Michael Hartl", email: "michael@example.com")を実行userを実行:nameとemailが設定されているuser.valid?を実行:true=オブジェクトの有効性(Validity)の確認user.save:データベースにUserオブジェクトを保存→成功したらtruesaveの過程で実行されるsqlコマンド(TRANSACTIONなど)も表示されるuser.nameなどUserモデルの属性をドットで繋ぐと個別で値が表示される
いろいろなメソッド
create:モデルの生成と保存を同時に行える(生成と保存は個別に行なう方が推奨とのこと)→User.createdestroy:モデルの削除(キャッシュには残っているのでfooではまだ表示される)→foo.destroyfind:引数にid番号を入れて検索する方法find_by:中の項目の値で検索することができるfirst:最初のデータを返すall:すべてのデータを返す
ユーザーオブジェクトを更新
user.email = "mhartl@example.net"などで更新できるsaveで保存reload.email:保存しないとリロードで元に戻るcreated_at:作成日時updated_at:更新日時(更新されている)update:ハッシュごとに値を更新できるupdate_attribute:一部のハッシュのみを更新できる
ユーザーを検証
- 検証(Validation)はe mailになっているかのチェックなどをすること
test/models/user_test.rbに有効なUserかどうかのテストを追記@user.valid?rails test:modelsでテスト実行→成功trueapp/models/user.rbにnameの存在性(Presence)のテストを追記test/models/user_test.rbとapp/models/user.rbにemail属性の検証に対するテストも追記→$ rails testを実行→truetest/models/user_test.rbとapp/models/user.rbにname属性とemail属性に長さのテストも追記→$ rails testを実行→true%w[]で文字列配列が作れる- メールフォーマットを正規表現で検証(
formatオプションと正規表現を使う) - 重複するメールアドレス拒否のテスト(
uniquenessオプションを使う) - 大文字小文字を区別しないテスト(
upcaseとuniquenessのcase_sensitiveを使う)
インデックス追加
- emailインデックスを追加:
$ rails generate migration add_index_to_users_email
→db/migrate/[timestamp]_add_index_to_users_email.rbが作成される - メールアドレスの一意性を強制するためのマイグレーションを追記(
add_index) - データベースをマイグレーション
rails db:migrate(この時、railsコンソールは閉じる) test/fixtures/users.ymlの内容を空にapp/models/user.rbのemail属性を小文字に変換してメールアドレスの一意性を保証する設定に修正test/models/user_test.rbのuniquenessテストを元に戻す
セキュアなパスワードを追加
app/models/user.rbにhas_secure_passwordを追加- マイグレーションファイル
add_password_digest_to_usersを生成
→$ rails generate migration add_password_digest_to_users password_digest:string rails db:migrate実行bcryptをGemfileに追加→$ bundle installでインストール→rails testは失敗test/models/user_test.rbにパスワードとパスワード確認を追加→rails testは成功test/models/user_test.rbにパスワードの最小文字数のテストを追記app/models/user.rbに存在性のバリデーションを追加→rails test:modelsは成功
ユーザーの作成と認証
$ rails consoleを起動User.createでデータを追加db/development.sqlite3をDB Browser for SQLiteで開き、Userモデルの属性のカラムがあることを確認- railsコンソールでパスワードを確認(
find_byとpassword_digest)→パスワードがハッシュ化された文字列が表示される authenticateでパスワードからユーザー情報を検索できる(存在しないパスワードだとfalseになる)- 頭に
!!をつけるとtrueが返される(論理値オブジェクトに変換)
本番環境でUserモデルを使う
bin/render-build.shを追加- ビルドスクリプトを作成
- Render>Settings>Build Commandを
./bin/render-build.shに変更→Save Changesを実行
終わりに
今回はデータベース系の処理をかなり経験できました。 見た目の機能はあまり変わっていませんが内部的にテストやバリデーション機能が追加されました。
次回は第7章はユーザー登録の機能を作っていくようです!それではまた!
Ruby/Ruby on Railsを習得するためにやったこと まとめ
qiita.com