前提
今回はユーザーの新規登録する場面を想定しています。
以下がユーザーを登録する為のusersテーブルです。
password_digest カラムが新規登録する際に設定するパスワードを格納しています。
+-----------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
| email | varchar(255) | YES | | NULL | |
| created_at | datetime | NO | | NULL | |
| updated_at | datetime | NO | | NULL | |
| password_digest | varchar(255) | YES | | NULL | |
+-----------------+--------------+------+-----+---------+----------------+
本題
railsではパスワードを設定する際に便利な機能が既に用意されています。
以下はusersテーブルを操作する為のモデルクラスです。
validates 群の下に has_secure_password とありますがこれはrailsに備わっている
メソッドです。
このメソッドをモデルクラスに追加することで今回の場合、usersテーブルのpassword_digest カラムに
暗号化されたパスワードを保存することが可能になります。(password_digest カラムは自分で作る必要があります。)厳密にはこの他にbcryptというgemが必要になるのでインストールしましょう。
インストールが済んだら正式に完了です。
class User < ApplicationRecord
validates :name, presence: true, length: { maximum: 50 }
validates :email, presence: true, format: { with: /\A([\w+\-].?)+@[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i }
validates :password, presence: true, length: { minimum: 6, maximum: 25 }, format: { with: /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]{8,}+\z/i }
has_secure_password
end
あとはこのメソッドを使用すると自動的に通常のパスワードと確認用のパスワードが一致しているかの確認を行ってくれます。フロント側に普通のパスワード用のフォームと確認用パスワード用のフォームを用意してsubmitすれば自動的に確認してくれます。
一応下記がそのフォームです。
<%= form_for @user do |f| %>
<div>
<%= f.label :name %>
<%= f.text_field :name %>
</div>
<div>
<%= f.label :email %>
<%= f.text_field :email %>
</div>
<div>
<%= f.label :password %>
<%= f.password_field :password %>
</div>
<div>
<%= f.label :password_confirmation %>
<%= f.password_field :password_confirmation%>
</div>
<%= f.submit "登録", class: "btn-block btn-white" %>
<% end %>
<%= link_to "ログイン", "#", class: "text-white" %>
</div>
</div>
</div>
</div>
これがパスワードフォームで
<%= f.password_field :password %>
これがパスワード確認用のフォームです。
<%= f.password_field :password_confirmation%>
:password
とpassword_confirmation
がparamsのハッシュのkeyとなって送信され、
keyのvalueが一致しているかモデルクラスで確認されますので名前は変えない方がいいと思います。