Yuki Matsumoto

To be engneer soon / Ruby on Rails

ログイン機能を作成する(パート2:Userに関するデータを作る)

2019-02-27 Yuki MatsumotoRuby on Rails

今日はログイン機能を実装する上で必要な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モデルの作成とパスワードの実装を行いました。明日もログイン機能を続けていきたいと思います。(眠い…)