railsのdeviseでログインとバリデーションが両立できない

実現したいこと

railsで会員登録機能を実装してます。

deviseを使いました。
ユーザー情報の編集機能を付け足そうとしたらエラーに遭遇しました。

前提

ここに質問の内容を詳しく書いてください。
(例)
TypeScriptで●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

ログイン時、以下のエラー
確かにアカウント作成時のパスワードの最小文字制限としてバリデーションを実装しました。
しかし、アカウント作成、アカウント情報更新時のみ動くバリデーションとして想定しており、ログイン時に動くことは想定してません。

ちなみに、ログイン時に入力したパスワードも6文字以上なのですが、なぜこのエラーが出るのか謎です。

ActiveRecord::RecordInvalid in DeviseTokenAuth::SessionsController#create Validation failed: Password is too short (minimum is 6 characters), Password is invalid

該当のソースコード

model

1class User < ActiveRecord::Base 2 devise :database_authenticatable, :registerable, 3 :recoverable, :rememberable, :validatable 4 include DeviseTokenAuth::Concerns::User 5 6 VALID_PASSWORD = /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i 7 validates :password, 8 format: { with: VALID_PASSWORD }, 9 on: :create 10 11 validates :password, 12 length: { in: 6..128}, 13 format: { with: VALID_PASSWORD }, 14 on: :update 15 16end

contoller

1class Auth::SessionsController < ApplicationController 2 def index 3 if current_user 4 render json: { is_login: true, data: current_user } 5 else 6 render json: { is_login: false, message: “ユーザーが存在しません” } 7 end 8 end 9end

rspec

1subject { post(‘/auth/sign_in’, params: params) } 2 context “メールアドレス、パスワードが正しいとき” do 3 let(:current_user) { FactoryBot.create(:user) } 4 let(:params) { { email: current_user.email, password: current_user.password } } 5 it “ログインできる” do 6 subject 7 expect(response).to have_http_status(200) 8 end

factorybot

1FactoryBot.define do 2 factory :user do 3 name { ‘test_user’ } 4 email { test@example.com”} 5 password { ‘testpass1234’ } 6 password_confirmation { password } 7 end 8end

試したこと

modelを以下のように書いてみたところ、ログインが正常にできたので、updateと書くのが悪さをしていると思ってはいますが、
なぜそうなるのかがわかりません。

model

1class User < ActiveRecord::Base 2 devise :database_authenticatable, :registerable, 3 :recoverable, :rememberable, :validatable 4 include DeviseTokenAuth::Concerns::User 5 6 VALID_PASSWORD = /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i 7 validates :password, 8 format: { with: VALID_PASSWORD }, 9 on: :create 10 11 validates :password, 12 length: { in: 6..128}, 13 format: { with: VALID_PASSWORD }, 14 on: :create 15 16end

聞きたいこと

・なぜ、ログインを実行する際に

on: :update

と記述したバリデーションが起動するのか?

・ログインするさいは、emailとパスワードを入力します。
この時入力するパスワードはもちろん6文字以上なのですが、なぜ「6文字未満はNG」のバリデーションに引っかかるのか。

コメントを投稿

0 コメント