2014-01-10 104 views
0

我有一個模型用戶具有通常的屬性電子郵件,email_confirmation,密碼,password_confirmation。我使用「has_secure_password」,因此數據庫中的真實屬性是email和password_digest。不過,我想限制密碼長度不超過6個字符的空格。如何使用Rails在模型中設置虛擬屬性?

這裏是我的模型:

class User < ActiveRecord::Base 
    before_validation :auto_strip_confirmation 
    validates :email,  presence: true, 
          length: { maximum: MAX_SIZE_DEFAULT_INPUT_TEXT }, 
          format: { with: VALID_EMAIL_REGEX }, 
          uniqueness: { case_sensitive: false }, 
          confirmation: true 
    validates :email_confirmation, presence: true 
    has_secure_password 
    validates :password, length: { minimum: MIN_SIZE_USER_PASSWORD, 
            maximum: MAX_SIZE_USER_PASSWORD } 

    private 

    def auto_strip_confirmation 
     self.password.strip! 
     self.password_confirmation.strip! 
    end 
end 

但我得到這個控制檯:

> user.password = user.password_confirmation = "a  " 
=> "a  " 
> user.valid? 
    User Exists (0.8ms) SELECT 1 AS one FROM "users" WHERE LOWER("users"."email") = LOWER('[email protected]') LIMIT 1 
=> true 

感謝您的幫助。

+0

我試過你的代碼,似乎工作正常,當我嘗試user.valid?時,我得到錯誤,你重新加載你的控制檯,並再次嘗試。 – suren

+0

如果您自己解決它,請使用.gsub(/ \ s + /,「」)刪除字符串中的所有空格 – suren

+0

,最好編寫自己的答案(並接受)。這樣,問題就不會公開。 – Roger

回答

0

重新加載後,我的代碼實際上在控制檯中工作:user.valid? => false(謝謝surendran)。但我最初的問題是在我的測試中:我以爲我不能設置虛擬屬性,因爲錯誤消息「未定義的方法`strip!」爲零:NilClass「。但我忘了我測試,如果我的用戶是有效的,當密碼是零,幾乎是這樣的:所以他試圖剝離nil對象

before { user.password = nil) } 
it { should_not be_valid } 

before_validation談到這個測試之前。