2013-08-24 20 views
0

邁克爾哈特爲Ruby on Rails提供的出色的tutorial工作方式。我正在創建一個測試來檢查重複的電子郵件地址,我對使用upcase,downcase和不區分大小寫的檢查有點困惑。Ruby on Rails教程 - upcase/downcase和不區分大小寫的奇怪用法

(清單6.17)的測試看起來是這樣的:

describe User do 
    before do 
    @user = User.new(name: "Example User", email: "[email protected]") 
    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 } 

什麼?爲什麼他會將副本轉換爲大寫,如果他要做一個不區分大小寫的驗證?

最後,在6.20中,他設置了一個before_save塊,將新用戶的電子郵件轉換爲小寫。

before_save { self.email = email.downcase } 

這很有道理,因爲您希望在數據庫中使用小寫字母。但我很困惑,爲什麼他在測試中使用了大寫字母,因爲保存會將電子郵件地址轉換爲小寫字母。我錯過了明顯的東西嗎?

回答

5

在我看來,通過轉換爲大寫字母,並將數據存儲爲小寫字母,您可以確保它們不相同,因此驗證程序的「case_sensitive:false」部分將進行真正的測試。

1

測試是(有點默默無聞,它不在描述中)聲明檢查唯一性時忽略該情況。一般來說,這對於電子郵件地址來說是明智的行爲。

存儲數據的小寫「標準化」,加上從驗證中刪除大小寫敏感似乎是過度殺傷,但可能需要,因爲驗證時的事件序列與保存相反。無論哪種方式,具有忽略大小寫的唯一性約束是自洽的,同時將電子郵件地址規範化爲小寫字母以存儲。

2

檢查@user.email.upcase無效可確保此值的唯一性,無論情況如何。 當你編寫uniqueness: { case_sensitive: false }時,你強制唯一性,不管情況如何:「foo」相當於「fOO」。 至於before_save設置它可能有點矯枉過正,並且對驗證大小寫不敏感,但至少它會向您顯示目標: 電子郵件必須是唯一的,無論大小寫是否爲驗證。另一方面,您將所有內容都存儲爲小寫字母,這是數據部分。