アプリ作成3・4日目ーユーザー管理機能
ユーザー管理機能作成手順
ブランチ作成(これ重要)
deviseの導入
deviseのUserモデル作成
テーブルの作成
deviseに関するビューファイルの作成
ユーザー認証機能の実装
ログイン・ログアウト機能の実装
バリデーションの設定
Userモデルに単体テストの実施
ブランチ作成
これはgithubの基本的な操作なので割愛。絶対忘れないように!
deviseの導入
・deviseというgemをインストールします。
Gemfileにgem 'devise'を記載
アプリのディレクトリにいるか確認してbundle installし再起動
・deviseの設定ファイルを作成します。
rails g devise:installを入力します。
ここで一度github上でcommit&pushしておきます。
※機能作成したらこまめにcommit&pushしておきましょう!
deviseのUserモデル作成
rails g devise userで作成するとVScodeにユーザーに関するモデルやマイグレーションが作成されています。
(ここでcommit&pushをはじめてしましたw忘れたので上記記載した人。)
テーブルの作成
昨日作成したuserテーブルのカラム名の名前と型、補足事項を記載し
rails db:migrateでテーブルを作成します。
ここでも再起動しておきます。
deviseに関するビューファイルの作成
通常であればrails g devise:viewsを入力し、次の実装に繋げます。
ユーザー認証機能の実装
ここには様々な知識が必要です。
・HTML&CSSの知識
・コードが冗長にならないための部分テンプレートの知識
・フォームの名前はデータベースで作成したカラム名にすること
などです。
その中でも重要な2つをご紹介します。
1️⃣form_withについて
・モデル名をインスタンスにする
・URLはrails routesでパスをみて記載
2️⃣renderについて
・参考にするファイルを記載する
・モデル名をインスタンスで書く場合とf.objectで書く場合あり
また、deviseをインストールしたときに次の2つのファイルが作られます。
①sessions/new.html.erb(ログイン画面)
②registrations/new.html.erb(新規登録画面)
ログイン・ログアウト機能の実装
入力した情報はパラメーターとして送信されますが、
情報には制限をつけなくてはいけません。
before_actionとdevise_parameter_sanitizerをストロングパラメーターとして使用します。
(deviseはgemであり直接操作できないのでapplication.controllerにて
このメソッドを使います)
データベースで作成したカラム名をキーとして許可する記述をしましょう。
バリデーションの設定
データベースで設定したカラム名(メアドやパスワード以外。
deviseの機能ですでにバリデーションがかかっています。)
のバリデーションを記載しましょう。
Userモデルに単体テストの実施
ここまででローカルで挙動を確認し、問題なければ
テストコードを記載して確認していきます。
3つのgemを導入していきます。
※いずれも、gemfileのdevelopment test doと記載のある所なので
お間違いないように。私は末尾に書いてしまい、修正しました。
間違えた際は場所を修正して、gemfile.lockを削除し、bundle installしましょう。
まずはRspecというgemです。
1️⃣Gemfileにgem 'rspec-rails', '~> 4.0.0'を追記し
bundle installします。
2️⃣Rspecの設定を行っていきます。
rails g rspec:installとし.rspecファイルに--format documentationを追記
(これはコードを見やすくするためです。)
3️⃣rails generate rspec:model userでコードを記載するテストファイルを作成します。(なんと、ここを抜かして次に行ってしまった筆者大汗)
2つ目はFactoryBotというgemです。
1️⃣Gemfileにgem 'factory_bot_rails'を追記し
bundle installします。
2️⃣specディレクトリ配下にfactoriesディレクトリ、その配下にusers.rbファイルを作成します。
3つ目はFakerというgemです。
Gemfileにgem 'faker'を追記し、bundle installします。
またfactories配下のuser.rbに、Fakerを使った
各カラムの値を記載していきます。
以下は例です。
FactoryBot.define do
factory :user do
name {Faker::Name.last_name}
email {Faker::Internet.free_email}
password {Faker::Internet.password(min_length: 6)}
password_confirmation {password}
end
end
ここでの注意はFakerは日本語に対応していないということです。
会員登録画面では
「カタカナ」「漢字」で記載することも多いかと思います。
対応させてテストコードを成功させるためには、以下の2つを試すとよいでしょう。
1️⃣'gimei'をGemfileにインストールする(以下を引用させていただきました)
Gemfileに以下の記載をし
group :development, :test do
# 省略
gem 'gimei'
end
factories/user.rbに以下を記載
FactoryBot.define do
factory :user do
# インスタンスを生成
japanese_user = Gimei.name
first_name { japanese_user.first.kanji }
first_name_kana { japanese_user.first.katakana }
last_name { japanese_user.last.kanji }
last_name_kana { japanese_user.last.katakana }
end
end
2️⃣仮の名前を書いておく
factories/user.rbに以下のように記載
FactoryBot.define do
factory :user do
email { Faker::Internet.unique.email }
password { '1' + Faker::Internet.password(min_length: 5, mix_case: true) }
password_confirmation { password }
nickname { Faker::Name.unique.first_name }
first_name { '佐藤' }
last_name { '二郎' }
first_name_kana { 'サトウ' }
last_name_kana { 'ジロウ' }
date_of_birth { Faker::Date.birthday(min_age: 18, max_age: 65) }
end
end
名前の漢字とカナは統一したほうがいいです。
どちらかというと1️⃣のほうが汎用性も高いのでおすすめです。
ここまででテストコードを書く準備はできました。
ここからテストコードを書いていきます。
テストコードは
①正常系
②異常系
を必ず両方書きます。
バリデーションで設定した制限を細やかに確認し、
一度メモノートへ項目の洗い出しをすることをお勧めします。
(私は足りなくて何回か修正しましたので汗)
各順序としては、
①正常系→②異常系 となります。
またRspecとFactoryBotを使う場合、コードを見やすくするために
以下のように書くことが一般的です。
require 'rails_helper'
RSpec.describe User, type: :model do
before do
@user = FactoryBot.build(:user)
end
describe 'ユーザー新規登録' do
context '新規登録できるとき' do
it 'nicknameとemail、passwordとpassword_confirmation、first_name、last_name、first_name_kana、last_name_kana、date_of_birthが存在すれば登録できる' do
expect(@user).to be_valid
end
end
context '新規登録できないとき' do
it 'nicknameが空では登録できない' do
@user.nickname = ''
@user.valid?
expect(@user.errors.full_messages).to include("Nickname can't be blank")
end
#省略
end
end
end
最後にターミナルでbundle exec rspec spec/models/user_spec.rbを実施し、正確なテストができているか確認しましょう。
上記のようになっていれば成功です。
私はここまで調べながらエラーを修正しながらなので、
2日時間がかかりました。
手順を覚えて、項目の洗い出しが適切にできれば、
もっとスムーズに進められるかもしれません!