【问题标题】:How to set a virtual attribute in model with Rails?如何使用 Rails 在模型中设置虚拟属性?
【发布时间】:2014-01-10 20:50:50
【问题描述】:

我有一个具有通常属性 email、email_confirmation、password、password_confirmation 的模型用户。我使用“has_secure_password”,所以数据库中的真正属性是电子邮件和密码摘要。但是,我想将不带空格的密码长度限制为 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 

感谢您的帮助。

【问题讨论】:

  • 我试过你的代码,似乎工作正常,当我尝试 user.valid 时我得到错误?,你是否重新加载你的控制台并再试一次。
  • strip 只会删除前导和尾随空格,使用 .gsub(/\s+/, "") 删除字符串中的所有空格
  • 如果你自己解决了,最好自己写答案(并接受)。这样问题就不会一直悬而未决。

标签: ruby-on-rails ruby


【解决方案1】:

重新加载后,我的代码实际上可以在控制台中运行:user.valid? => 错误(感谢 Surendran)。但我最初的问题是在我的测试中:我认为我无法设置虚拟属性,因为错误消息“未定义的方法`strip!'对于零:NilClass”。但是我忘了我在密码为 nil 时测试我的用户是否有效,几乎像这样:

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

before_validation 出现在这个测试之前,所以他试图剥离一个 nil 对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多