ログイン機能を作成する(パート2:Userに関するデータを作る)
今日はログイン機能を実装する上で必要なUserモデルを作っていこうと思います。現状のアイデア共有サービスにはUerを定義するデータがないです。なのでまずはUserに関するデータベースを作っていきます。
Userモデルを作る
Userモデルに最低限必要な情報は”メールアドレス”、“パスワード”です。パスワードの属性名はpassword_digest
としてありますが、これはRailsに標準でついているhas_secure_password
という機能を使ったときの命名ルールに沿った名前です。“digest”は元の値に戻すことができない不可逆的な変換(ハッシュ化)を行った文字列のことです。
それではUserモデルを作っていきます。
bundler exec rails g model user name:string email:string password_digest:string
次に名前やメールアドレス何かしらの文字列が必ず入るので、これらの属性がNULLになることはありません。また、メールアドレスが重複することもありません。ありえない値が入ることを防ぐためにマイグレーションファイルを編集します。
class CreateUsers < ActiveRecord::Migration[5.2]
def change
create_table :users do |t|
t.string :name, null: false
t.string :email, null: false
t.string :password_digest, null: false
t.timestamps
t.index :email, unique: true
end
end
end
ファイルを変更したらマイグレーションを実行してデータベースにusersテーブルを作成します。
bundler exec rails db:migrate
usersテーブルが作成できたので、今できている機能を確認するためにコンソールからUserモデルのオブジェクトを作成します。(場所: db -> migrate -> ◯◯◯createusers.rb)
bundler exec rails c
user = User.create(name: 'test', email: "test@gmail.com", password_digest: "test")
パスワードを受け付けてdigestを保存する
usersテーブルができたことでuserの名前やメールアドレス、パスワードを保存する仕組みは出来ましたが、ユーザーが指定したパスワードをdigestを変換する仕組みがないです。なので、パスワードの入力を受けてdigestを生成・保存するようモデルに実装を加えていきます。
has_secure_password
を使ってパスワードをハッシュ化するためにbcryptというハッシュ関数を提供するgemを使います。bcryptはgemfile内でコメントアウトされているので外してください。
# Use ActiveModel has_secure_password
gem 'bcrypt', '~> 3.1.7'
bundleコマンドを実行する
bundle install
bcyptがインストールできたので、Userモデル内でhassecurepasswordが使えるようになりました。app/models/users.rb
で以下を記述する。
class User < ApplicationRecord
has_secure_password
end
モデルの中にhas_secure_password
を記述すると、データベースの絡むには対応しない属性が2つ追加されます。1つ目の属性はpasswordです。password属性はユーザーが入力した生のパスワードを一時的に格納するための属性です。2つ目の属性はpassword_confirmation
です。これはログイン時によくある確認用のパスワード入力を行う際のものです。パスワードを入力してもらい、確認用のパスワードを入力し、一致した時だけユーザー登録を成功させることがよくあります。password_confirmation
属性はこのやり方における確認用のパスワードを一時的に格納します。password属性とpassword_confirmation属性の値が一致しない場合は検証に失敗します。
実際にコンソールを使って試してみる。
User.new(name: 'test', email: 'testo@gmail.com', password: 'test', password_confirmation: 'test').save
無事登録できた。次にpassword_digest属性にどのような値が入ってるか確認する。
user.password_digest
まとめ
今回はログイン機能を実装する上で必要なUserモデルの作成とパスワードの実装を行いました。明日もログイン機能を続けていきたいと思います。(眠い…)