メールの一意性をチェックする rspec テストを次に示します ( http://ruby.railstutorial.org/chapters/modeling-users.html#code-validates_uniqueness_of_email_testから)
require 'spec_helper'
describe User do
before do
@user = User.new(name: "Example User", email: "user@example.com")
end
.
.
.
describe "when email address is already taken" do
before do
user_with_same_email = @user.dup
user_with_same_email.save
end
it { should_not be_valid }
end
end
著者が述べたように、私は追加しました
class User < ActiveRecord::Base
.
.
.
validates :email, presence: true, format: { with: VALID_EMAIL_REGEX },
uniqueness: true
end
私のユーザーモデルとテストに合格します。
しかし、@user はまだデータベースに保存されていません (コードのどこにも @user.save ステートメントが見つかりません)。そのため、user_with_same_email は、データベースに同じ電子メールを持つ他のユーザーがいないため、既に一意です。次に、それはどのように機能しますか?
コンソールで同様のものを作成しました。user_with_same_email.valid? false を返します (「すでに取得されています」というエラーが表示されます) が、user_with_same_email.save は引き続き機能します。なぜ?