お世話になっております。
railsのcase_sensitiveについて、どうしても分からないため質問させて頂きました。
よろしくお願い致します。
前提・実現したいこと
現在Nuxt.jsとrailsAPIとmariaDBでアプリを作成しています。そこでユーザー登録のためemailにバリデーションをつけたいと思っており、具体的には以下です。
実現したいこと: emailのバリデーションで大文字小文字を区別したい
発生している問題・エラーメッセージ
case_sensitive: trueを明記しても大文字小文字の区別がされない。
実際にrspecのエラーメッセージには"Email has already been taken"と書かれており、大文字小文字の区別ができていないことが分かります。
Failures: 1) User users check 'case_sensitive: true' Failure/Error: expect(user).to be_valid expected #<User id: nil, provider: "email", uid: "", name: "test", image: nil, email: "example@example.com", allow_password_change: false, created_at: nil, updated_at: nil> to be valid, but got errors: Email has already been taken, Email has already been taken # ./spec/models/user_spec.rb:79:in `block (3 levels) in <main>' # /usr/local/bundle/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:55:in `load' # /usr/local/bundle/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:55:in `load' # /usr/local/bundle/gems/spring-commands-rspec-1.0.4/lib/spring/commands/rspec.rb:18:in `call' # -e:1:in `<main>'
該当のソースコード
######user_spec.rb
it "check 'case_sensitive: true'" do FactoryBot.create(:user, email: "example@example.com") user = FactoryBot.build(:user, email: "Example@example.com") expect(user).to be_valid end
######spec/factories/users.rb
FactoryBot.define do factory :user do name { "test" } sequence(:email) { |n| "example#{n}@example.com" } password { "password" } password_confirmation { "password" } end end
######models/user.rb
# frozen_string_literal: true class User < ActiveRecord::Base # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable include DeviseTokenAuth::Concerns::User validates :name, presence: true, length: { maximum: 10 } validates :email, uniqueness: { case_sensitive: true } end
######db/schema.rb
# This file is auto-generated from the current state of the database. Instead # of editing this file, please use the migrations feature of Active Record to # incrementally modify your database, and then regenerate this schema definition. # # This file is the source Rails uses to define your schema when running `rails # db:schema:load`. When creating a new database, `rails db:schema:load` tends to # be faster and is potentially less error prone than running all of your # migrations from scratch. Old migrations may fail to apply correctly if those # migrations use external dependencies or application code. # # It's strongly recommended that you check this file into your version control system. ActiveRecord::Schema.define(version: 2020_04_11_075604) do create_table "users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t| t.string "provider", default: "email", null: false t.string "uid", default: "", null: false t.string "name" t.string "image" t.string "email" t.string "encrypted_password", default: "", null: false t.string "reset_password_token" t.datetime "reset_password_sent_at" t.boolean "allow_password_change", default: false t.datetime "remember_created_at" t.string "confirmation_token" t.datetime "confirmed_at" t.datetime "confirmation_sent_at" t.string "unconfirmed_email" t.integer "sign_in_count", default: 0, null: false t.datetime "current_sign_in_at" t.datetime "last_sign_in_at" t.string "current_sign_in_ip" t.string "last_sign_in_ip" t.text "tokens" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true t.index ["email"], name: "index_users_on_email", unique: true t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true t.index ["uid", "provider"], name: "index_users_on_uid_and_provider", unique: true end end
試したこと
- テスト環境のDBのデータを初期化しました。その後にテストを行ったので、データがロールバックされていない訳ではありません。
- rails consoleでも大文字小文字の区別がされず、登録できませんでした。
- rails newでmodelのみを作成したアプリで試したところ、やはりcase_sensitiveが効きませんでした。(DBはsqlite3)
補足情報(FW/ツールのバージョンなど)
ruby 2.6.3
rails 6.0.2.2
devise 4.7.1
devise_token_auth 1.1.3
mariaDB 10.5.1
回答1件
あなたの回答
tips
プレビュー