如何使用Rails在模型中设置虚拟属性?

时间:2014-01-10 20:50:50

标签: ruby-on-rails ruby

我有一个模型User,其中包含常用属性email,email_confirmation,password,password_confirmation。我使用“has_secure_password”,因此数据库中的真实属性是email和password_digest。但是我想将密码长度限制为6个字符。

这是我的模特:

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('user@example.com') LIMIT 1
 => true 

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

重新加载后,我的代码实际上在console:user.valid? =&GT;假(谢谢surendran)。但我最初的问题是在我的测试中:我认为我无法设置虚拟属性,因为错误消息“未定义的方法`条带!”为零:NilClass“。但我忘了我测试我的用户是否有效,当密码为零时,几乎像这样:

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

before_validation在此测试之前到来,因此他尝试剥离一个nil对象。