はじめてのRailsチュートリアル(6章)
学習の備忘録で、自分用メモとして残しておきます!
5章でレイアウト・ルーティング(それに伴うテストの書き方)について学びました!本章ではユーザーモデルの作成と、データを保存する方法について学びたいと思います!
Userモデルを作る
$ rails generate controller Users new
コントローラ名には複数形を使い、モデル名には単数形を用いるんですね〜!
rails gで自動生成されたマイグレーションファイルは、データベースを変更するメソッドの集まりで、実行するにはdb:migrateコマンドを使います。それに対して、元に戻すときはdb:rollbackコマンドを使います。
modelファイル
userモデルをrails consoleでみてみると、ApplicationRecordを継承していることがわかります。そして、ApplicationRecordがActiveRecord::Baseを継承してることが下記コマンドで確認できました!
ユーザーの検索
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"]エラーとなりました!ちゃんとバリデーションが効いていてホッとしました😊
正しくテストが動作することを確認できたので、実際にユーザーの作成をしていきます!
ユーザーの作成と認証
rails consoleしてMichael Hartlというユーザーを作成します。
DB Browser for SQLiteにてDBの中身を確認します。rails tutorialではクラウドIDEでの説明だったので、私はこちらのQiitaを参考に確認してみました。
オオオ〜
ユーザーテーブルに今登録したユーザーがいる事を確認できました!🎉
今までrails console上で確認するだけだったので、DBを視覚的に確認できると嬉しいです。
password_digest カラムには意味不明な文字列が入ってます。これはbcryptというgemを利用してパスワードをハッシュ 化しています。この文字列から、元のパスワードを推測するのはむずかしいので、いろんな攻撃から守る事ができるそう。
ハッシュから平文を得るテクニック↓から守っている👊🏻
これで、先ほど登録したuserの情報を参照しても、passwordは暗号化されていて分かりません。
間違ったパスワードをauthenticateメソッドで確認するとfalseになります。
authenticateメソッドに正しいパスワードを渡すと、userの情報が返ってくるようになりました😊
まとめ
ゼロからuserモデルを作成し、name, email属性などを追加しました。また、テストを書きながらバリデーションの方法を学ぶ事ができた章となりました!🍵