0

Michael Hartl のRuby on Rails に関する優れたチュートリアルに取り組んでいます。私は彼が電子メール アドレスの重複をチェックするテストを作成しているところで、大文字、小文字、および大文字と小文字を区別しないチェックの使用について少し混乱しています。

テスト (リスト 6.17) は次のようになります。

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.email = @user.email.upcase
      user_with_same_email.save
    end

    it { should_not be_valid }
  end
end

への呼び出しに注意してくださいupcase。大丈夫だ。しかし、妥当性チェック (6.18) では、大文字と小文字の区別を offに設定しています。

validates :email, presence: true, format: { with: VALID_EMAIL_REGEX },
                    uniqueness: { case_sensitive: false }

何?大文字と小文字を区別しない検証を行うつもりだったのに、なぜコピーを大文字に変換したのでしょうか?

before_save最後に、6.20 で、彼は新しいユーザーの電子メールを小文字に変換するブロックを設定します。

before_save { self.email = email.downcase }

データベースで小文字が必要なため、これは完全に理にかなっています。しかし、保存すると電子メールアドレスが小文字に変換されることを考えると、なぜ彼がテストで大文字を使用したのか、私は混乱しています。明らかな何かが欠けていますか?

4

3 に答える 3

5

大文字に変換し、データを小文字として保存することで、それらが同等ではないことを確認できるように思われるため、バリデーターの「case_sensitive:false」部分が実際にテストされます。

于 2013-08-24T19:44:22.960 に答える
2

無効であることを確認する@user.email.upcaseことで、ケースに関係なく、この値の一意性が保証されます。書くときはuniqueness: { case_sensitive: false }、どのような場合でも一意性を強制します: "foo" は "fOO" と同等です。については、before_saveそれを設定し、大文字と小文字を区別しない検証は少しやり過ぎかもしれませんが、少なくとも目標を示しています。電子メールは大文字と小文字に関係なく一意でなければなりません。一方、すべて小文字で保存します。これはデータ部分です。

于 2013-08-24T19:47:10.633 に答える
1

テストは (少し静かに、説明にはありません)、一意性をチェックするときに大文字と小文字を区別しないことを主張しています。これは、一般的な電子メール アドレスの賢明な動作です。

保存されたデータの小文字の「正規化」に加えて、検証から大文字と小文字の区別を削除することはやり過ぎのように思えますが、保存ではなく検証するときの一連のイベントのために必要になる場合があります。どちらの場合でも、大文字と小文字を区別しない一意性制約を持つことは自己一貫性があり、メールアドレスを小文字に正規化して保存します。

于 2013-08-24T19:46:10.287 に答える