はじめてのRailsチュートリアル(6章)

学習の備忘録で、自分用メモとして残しておきます!

5章でレイアウト・ルーティング(それに伴うテストの書き方)について学びました!本章ではユーザーモデルの作成と、データを保存する方法について学びたいと思います!

Userモデルを作る

$ rails generate controller Users new

コントローラ名には複数形を使い、モデル名には単数形を用いるんですね〜!

rails gで自動生成されたマイグレーションファイルは、データベースを変更するメソッドの集まりで、実行するにはdb:migrateコマンドを使います。それに対して、元に戻すときはdb:rollbackコマンドを使います。

modelファイル

userモデルをrails consoleでみてみると、ApplicationRecordを継承していることがわかります。そして、ApplicationRecordがActiveRecord::Baseを継承してることが下記コマンドで確認できました!

スクリーンショット 2019-12-14 15.42.01

ユーザーの検索

rails consoleでUser.newしたユーザーをActive Recordで検索することができます。直感的で分かりやすい👀

// id: 3のユーザー
User.find(3)
// emailでユーザーを検索
User.find_by(email: "mhartl@example.com")
// nameでユーザーを検索
User.find_by_name("Michael Hartl")
// データベースの最初のユーザー
User.first
// データベースのすべてのユーザー
User.all

ユーザーの更新

こちらも分かりやすいです👀ただ、name: と :name があるのがややこしいかなぁ😥

user
=> #<User id: 1, name: "Michael Hartl", email: "mhartl@example.com",
created_at: "2016-05-23 19:05:58", updated_at: "2016-05-23 19:05:58">
// そのまま代入
 user.email = "foo@bar.com"
// 全ての項目を更新
 user.update_attributes(name: "The Dude", email: "dude@abides.org")
// 一部のみ更新
user.update_attribute(:name, "El Duderino")

ユーザーの検証

テスト駆動開発は仕事で常に正しく適用できるとは限りません

Railsチュートリアルはテストをちゃんと書いてすすめていくので、この一文は大人な一文だなぁと感じました。

しかし、モデルのバリデーション機能は、テスト駆動開発とまさにピッタシの機能と言えます

確かにバリデーションとかはテストが書きやすそう。ということで書いていきます!!

有効なUserかどうかをテストする

setupメソッド内に書かれた処理は、各テストが走る直前に実行されます

class UserTest < ActiveSupport::TestCase
 def setup
   @user = User.new(name: "Example User", email: "user@example.com")
 end
 test "should be valid" do
   assert @user.valid?
 end
end

モデルのテストだけしたいときはこれでできました!👊🏻

$ rails test:models

他のバリデーション

あとは、emailが有効であるかを正規表現を使って検証・テストしたり、パスワードが有効かどうかの検証なども行いました。

↓正規表現で使ったサイト

has_secure_passwordを追加することで、パスワードを指定しないと["Password can't be blank"]エラーとなりました!ちゃんとバリデーションが効いていてホッとしました😊

スクリーンショット 2019-12-22 15.09.12

正しくテストが動作することを確認できたので、実際にユーザーの作成をしていきます!

ユーザーの作成と認証

rails consoleしてMichael Hartlというユーザーを作成します。

スクリーンショット 2019-12-22 15.53.44

DB Browser for SQLiteにてDBの中身を確認します。rails tutorialではクラウドIDEでの説明だったので、私はこちらのQiitaを参考に確認してみました。

オオオ〜

スクリーンショット 2019-12-22 15.55.45

ユーザーテーブルに今登録したユーザーがいる事を確認できました!🎉

今までrails console上で確認するだけだったので、DBを視覚的に確認できると嬉しいです。

password_digest カラムには意味不明な文字列が入ってます。これはbcryptというgemを利用してパスワードをハッシュ 化しています。この文字列から、元のパスワードを推測するのはむずかしいので、いろんな攻撃から守る事ができるそう。

ハッシュから平文を得るテクニック↓から守っている👊🏻

これで、先ほど登録したuserの情報を参照しても、passwordは暗号化されていて分かりません。

スクリーンショット 2019-12-22 16.08.23

間違ったパスワードをauthenticateメソッドで確認するとfalseになります。

スクリーンショット 2019-12-22 16.09.05

authenticateメソッドに正しいパスワードを渡すと、userの情報が返ってくるようになりました😊

スクリーンショット 2019-12-22 16.09.51

まとめ

ゼロからuserモデルを作成し、name, email属性などを追加しました。また、テストを書きながらバリデーションの方法を学ぶ事ができた章となりました!🍵


スキ頂けると嬉しいです〜