質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

2426閲覧

Rails deviseのpasswordカラムに追加のバリデーションをかけたい

sewwolf

総合スコア4

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/12/19 06:22

railsで単体テストのコードを書いています。
deviseを導入していて、passwordに半角英数字が含まなければならないようなバリデーションをかけたいです。
deviseによってかかっているバリデーションを解除して一から全てのバリデーションの記述をするのではなく、deviseのバリデーションがかかっている状態から追加する感じに実装したいです。

ruby

1#user.rb 2has_many :items 3 has_many :records 4 5 with_options presence: true do 6 validates :nickname 7 validates :first_name, format: { with: /\A[ぁ-んァ-ヶ一-龥々ー]+\z/ } 8 validates :last_name, format: { with: /\A[ぁ-んァ-ヶ一-龥々ー]+\z/ } 9 validates :kana_first_name, format: { with: /\A[ァ-ヶー]+\z/ } 10 validates :kana_last_name, format: { with: /\A[ァ-ヶー]+\z/ } 11 validates :birthday 12 end 13 14 VALID_PASSWORD_REGEX = /\A[a-z0-9]+\z/i 15 validates :password, format: { with: VALID_PASSWORD_REGEX, message: 'Contain both numbers and letters'}

ruby

1#user_spec.rb 2require 'rails_helper' 3 4RSpec.describe User, type: :model do 5 before do 6 @user = FactoryBot.build(:user) 7 end 8 9 describe 'ユーザー新規登録' do 10 context '新規登録できるとき' do 11 it 'email、password、password_confirmation、nickname、first_name、last_name、kana_first_name、kana_last_name、birthdayが存在すれば登録できる' do 12 expect(@user).to be_valid 13 end 14 end 15 context '新規登録できないとき' do 16 it 'emailが空では登録できない' do 17 @user.email = '' 18 @user.valid? 19 expect(@user.errors.full_messages).to include("Email can't be blank") 20 end 21 it 'passwordが空では登録できない' do 22 @user.password = '' 23 @user.valid? 24 expect(@user.errors.full_messages).to include("Password can't be blank") 25 end 26 it 'passwordとpassword_confirmationが不一致では登録できない' do 27 @user.password_confirmation = '' 28 @user.valid? 29 expect(@user.errors.full_messages).to include("Password confirmation doesn't match Password") 30 end 31 it 'nicknameが空では登録できない' do 32 @user.nickname = '' 33 @user.valid? 34 expect(@user.errors.full_messages).to include("Nickname can't be blank") 35 end 36 it 'first_nameが空では登録できない' do 37 @user.first_name = '' 38 @user.valid? 39 expect(@user.errors.full_messages).to include("First name can't be blank", "First name is invalid") 40 end 41 it 'last_nameが空では登録できない' do 42 @user.last_name = '' 43 @user.valid? 44 expect(@user.errors.full_messages).to include("Last name can't be blank", "Last name is invalid") 45 end 46 it 'kana_first_nameが空では登録できない' do 47 @user.kana_first_name = '' 48 @user.valid? 49 expect(@user.errors.full_messages).to include("Kana first name can't be blank", "Kana first name is invalid") 50 end 51 it 'kana_last_nameが空では登録できない' do 52 @user.kana_last_name = '' 53 @user.valid? 54 expect(@user.errors.full_messages).to include("Kana last name can't be blank", "Kana last name is invalid") 55 end 56 it 'birthdayが空では登録できない' do 57 @user.birthday = '' 58 @user.valid? 59 expect(@user.errors.full_messages).to include("Birthday can't be blank") 60 end 61 it '重複したemailが存在する場合登録できない' do 62 @user.save 63 another_user = FactoryBot.build(:user) 64 another_user.email = @user.email 65 another_user.valid? 66 expect(another_user.errors.full_messages).to include('Email has already been taken') 67 end 68 it 'passwordが5文字以下では登録できない' do 69 @user.password = 'aaaa9' 70 @user.password_confirmation = 'aaaa9' 71 @user.valid? 72 expect(@user.errors.full_messages).to include('Password is too short (minimum is 6 characters)') 73 end 74 it 'passwordが数字だけでは登録できない' do 75 @user.password = '999999' 76 @user.password_confirmation = '999999' 77 @user.valid? 78 binding.pry 79 expect(@user.errors.full_messages).to include('Contain both numbers and letters') 80 end 81 end 82 end 83end 84 85

ruby

1#テストコード実行結果 2 passwordが数字だけでは登録できない (FAILED - 1) 3Failures: 4 5 1) User ユーザー新規登録 新規登録できないとき passwordが数字だけでは登録できない 6 Failure/Error: expect(@user.errors.full_messages).to include('Contain both numbers and letters') 7 expected [] to include "Contain both numbers and letters" 8 # ./spec/models/user_spec.rb:77:in `block (4 levels) in <top (required)>' 9 10Finished in 0.0742 seconds (files took 1.28 seconds to load) 1113 examples, 1 failure 12 13Failed examples: 14 15rspec ./spec/models/user_spec.rb:73 # User ユーザー新規登録 新規登録できないとき passwordが数字だけでは登録できない

ruby

1 2[1] pry(#<RSpec::ExampleGroups::User::Nested::Nested_2>)> @user.errors 3=> #<ActiveModel::Errors:0x00007ff4021137f0 4 @base= 5 #<User id: nil, email: "test@example", nickname: "nobi", first_name: "佐藤", last_name: "太郎", kana_first_name: "サトウ", kana_last_name: "タロウ", birthday: "2000-10-19", created_at: nil, updated_at: nil>, 6 @details={}, 7 @messages={}>

バリデーションの記述が悪いのかエラーメッセージも渡せていないようでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

/\A[a-z0-9]+\z/i は 「半角英数字が含まなければならない」ではなく「半角英数字のみでなければならない」です。「半角英数字が全種類」でもないです

投稿2021/12/19 23:06

編集2021/12/19 23:08
winterboum

総合スコア23347

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sewwolf

2021/12/21 07:22

ご指摘ありがとうございます。バリデーションのかけかたについてはわかりますでしょうか?
winterboum

2021/12/21 09:06

パスワード 英数字混合 正規表現 あたりで検索してみて
sewwolf

2021/12/21 11:38

解決できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問