Ruby on rails 如何允许\u nil让空字符串通过验证
我正在阅读MichaelHartl的RubyonRails教程(第三篇)。在第9章中,有一个例子向我们展示了如何更新用户信息。我被附在这里的“不允许”弄糊涂了。我将代码简化如下:Ruby on rails 如何允许\u nil让空字符串通过验证,ruby-on-rails,validation,Ruby On Rails,Validation,我正在阅读MichaelHartl的RubyonRails教程(第三篇)。在第9章中,有一个例子向我们展示了如何更新用户信息。我被附在这里的“不允许”弄糊涂了。我将代码简化如下: class User < ActiveRecord::Base has_secure_password validates :password, presence: true, length: { minimum: 6 }, allow_nil: true end myuser=User.new(nam
class User < ActiveRecord::Base
has_secure_password
validates :password, presence: true, length: { minimum: 6 }, allow_nil: true
end
myuser=User.new(name: "Foo_bar",email: "test@example.com", password: "123456", password_confirmation: "123456")
myuser.save
myuser=User.find(myuser.id)
myuser.update_attributes(name: "Bar_Foo",email: "test@example.com", password: "", password_confirmation: "") # It will succeed! But WHY?
class用户
我理解
allow\u nil:true
在验证的值为nil时跳过验证。然而,显然,password:“
不是零值。如何允许\u nil:true
允许空字符串?您可以在irb中尝试:
user = User.new
user.password = '123'
user.password_confirmation = '123'
user.password_digest.nil? => false
user = User.new
user.password = ''
user.password_confirmation = ''
user.password_digest.nil? => true
这种行为是由于
拥有安全的密码魔法造成的。简而言之,它检查给定的密码是否为空,如果为空,则不会将任何内容分配给@password
。因此:
user = User.new
user.password = '' # This is not an assignment, but invocation of `password=` method.
user.password #=> nil
您可以在此处看到password=
方法背后的源代码:
还要注意的是,has_secure_password
已经定义了默认密码验证,因此如果您想创建自己的密码验证,您需要使用has_secure_password validation:false调用它,这是不正确的,空字符串不是零,如果您尝试了空字符串以外的任何值,它也将返回nil。put
始终返回nil,这并不意味着a
为nil。使用a.nil?
测试它put
方法现在返回nil的效果要好得多,不过验证是在password
上进行的,而不是password\u digest
有安全的密码
始终使用password\u digest
字段user.password.nil?=>false
如何为零只有在模型中实现了has\u secure\u password
时才会发生这种情况。如果我们使用has\u secure\u password validation调用它:false
。那么问题仍然存在。如果删除了allow\u nil:true
,验证将失败。这意味着allow\u nil:true
仍然应用于password\u digest
?除了从头开始编写password=(password)之外,还有其他解决方法吗?最好实现最小密码长度