ユーザー管理機能のバリデーションについて

gyazo.com

 

 

ユーザー管理機能のバリデーション設計で中々エラーを解決できなかったのでまとめておきます。

 

1つめのエラー(一意性)

User ユーザー新規登録 重複したemailが存在する場合は登録できないこと

Failure/Error: expect(@user.errors.full_messages).to include('Email has already been taken')

       expected to include "Email has already been taken"

登録されたエラー文の中から'Email has already been taken'が出て欲しいが、エラー文が出ませんでしたということ。

validates :email, presence: true

上記バリデーションでemailが空では登録できないとしていたところを

 

validates :email, presence: true, uniqueness: { case_sensitive: false }

上記でemailが空では登録できないかつ、登録されたことのあるものでは登録できない(一意性)と条件をつけると解決しました。

 

2つめのエラー(半角英数字混合)

2) User ユーザー新規登録 passwordが半角英数字混合であれば登録できる

     Failure/Error: expect(@user.errors.full_messages).to include("Password には英字と数字の両方を含めて設定してください")

       expected to include "Password には英字と数字の両方を含めて設定してください"

 

it "passwordが半角英文字なしでは登録できない" do
@user.password = "123456"
@user.password_confirmation = "123456"
@user.valid?
expect(@user.errors.full_messages).to include("Password is invalid")
end
it "passwordが半角数字なしでは登録できない" do
@user.password = "aaaaaa"
@user.password_confirmation = "aaaaaa"
@user.valid?
expect(@user.errors.full_messages).to include("Password is invalid")
end

始め半角英数字混合でテストコードを作成しようとしていたが、それはできないようで1つずつ半角英文字がないと登録できないと、半角数字がないと登録できないとに分けて書いた。

また、エラー文を定型文でなく"Password には英字と数字の両方を含めて設定してください"にしていたこともエラーの原因のため定型文の "Password is invalid"に直した。

 

validates :password, format: {with: /\A(?=.*?[a-z])(?=.*?[\d])[a-z\d]+\z/i } 

また、バリデーション の正規表現が適切でなかったため、上記のように変更した。 

正規表現は「format: {with: 正規表現}」

という形式で書く。

また、正規表現は以前間違えてエラーなどが出ていると、コードが合っていてもエラーが出ることがあります。その場合、エディタやターミナルを一度切って、再接続するとエラーが出ないことがあります。また、コピーで持ってきた正規表現をコピーし直すことも有効です。