見出し画像

アプリ作成3・4日目ーユーザー管理機能

ユーザー管理機能作成手順

  1. ブランチ作成(これ重要)

  2. deviseの導入

  3. deviseのUserモデル作成

  4. テーブルの作成

  5. deviseに関するビューファイルの作成

  6. ユーザー認証機能の実装

  7. ログイン・ログアウト機能の実装

  8. バリデーションの設定

  9. 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日時間がかかりました。

手順を覚えて、項目の洗い出しが適切にできれば、
もっとスムーズに進められるかもしれません!

いいなと思ったら応援しよう!

なっちゃん
駆け出しエンジニアなっちゃんの亀さんのような成長をあたたかく見守ってくださるとうれしいです。 自己研鑽に拍車をかけたいと思います!