2014-01-10 69 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谈到这个测试之前。