gpt4 book ai didi

ruby-on-rails - 当密码也存在或已更改时,Rails 会验证 password_confirmation 是否存在

转载 作者:行者123 更新时间:2023-12-04 13:34:21 26 4
gpt4 key购买 nike

我有以下用户模型:

class User < ActiveRecord::Base
# Users table has the necessary password_digest field
has_secure_password
attr_accessible :login_name, :password, :password_confirmation

validates :login_name, :presence=>true, :uniqueness=>true

# I run this validation on :create so that user
# can edit login_name without having to enter password
validates :password,:presence=>true,:length=>{:minimum=>6},:on=>:create

# this should only run if the password has changed
validates :password_confirmation,
:presence=>true, :if => :password_digest_changed?
end

这些验证并没有像我希望的那样做。可以执行以下操作:
# rails console
u = User.new :login_name=>"stephen"
u.valid?
# => false
u.errors
# => :password_digest=>["can't be blank"],
# => :password=>["can't be blank", "please enter at least 6 characters"]}

# so far so good, let's give it a password and a valid confirmation
u.password="password"
u.password_confirmation="password"

# at this point the record is valid and does save
u.save
# => true

# but we can now submit a blank password from console
u.password=""
# => true
u.password_confirmation=""
# => true

u.save
# => true
# oh noes

所以我想要的是以下内容:
  • 创建时需要密码,长度必须为 6 个字符
  • 创建时需要 password_confirmation,必须匹配密码
  • 用户在更新 login_name 时不必提交密码
  • 更新时无法删除密码

  • 令我困惑的是 rails 会抛出 无方法如果我使用 password_changed? 会出错而不是 :password_digest_changed?在我的 password_confirmation 验证中。我不明白为什么。

    那么有谁知道我在这里做错了什么?

    最佳答案

    password不是数据库中的一列,对吗?只是一个属性?

    所以没有password_changed?方法,如果 password 可用是一列。相反,您应该检查是否 password完全设置。

    就像是:

    validates :password_confirmation, :presence => true, :if => '!password.nil?'

    虽然这解决了您最初遇到的问题,但它仍然不能完全满足您的要求,因为它只是检查存在性,您需要它存在并匹配密码。像下面这样的东西应该可以工作(结合上面的验证)。
    validates :password, 
    # you only need presence on create
    :presence => { :on => :create },
    # allow_nil for length (presence will handle it on create)
    :length => { :minimum => 6, :allow_nil => true },
    # and use confirmation to ensure they always match
    :confirmation => true

    如果您从未见过 :confirmation之前,它是一个标准验证,用于查找 foofoo_confirmation并确保它们相同。

    请注意,您仍然需要检查 password_confirmation 是否存在

    关于ruby-on-rails - 当密码也存在或已更改时,Rails 会验证 password_confirmation 是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7863441/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com