Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何允许\u nil让空字符串通过验证_Ruby On Rails_Validation - Fatal编程技术网

Ruby on rails 如何允许\u nil让空字符串通过验证

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

我正在阅读MichaelHartl的RubyonRails教程(第三篇)。在第9章中,有一个例子向我们展示了如何更新用户信息。我被附在这里的“不允许”弄糊涂了。我将代码简化如下:

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)之外,还有其他解决方法吗?最好实现最小密码长度