簡體   English   中英

allow_nil如何讓空字符串通過驗證

[英]How can allow_nil let an empty string pass the validation

我正在閱讀Michael Hartl的Ruby On Rails教程(第3篇) 在第9章中,有一個示例向我們展示了如何更新用戶信息。 我對這里附帶的allow_nil感到困惑。 我將代碼簡化如下:

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?

我了解allow_nil: true當要驗證的值為nil時, allow_nil: true跳過驗證。 不過顯然, password: ""不是零值。 allow_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 

此行為歸因於has_secure_password魔術。 簡而言之,它檢查給定的密碼是否為空,如果為@password ,則不分配任何內容。 因此:

user = User.new
user.password = '' # This is not an assignment, but invocation of `password=` method.
user.password #=> nil

您可以在此處查看password=方法背后的源代碼: https : //github.com/rails/rails/blob/869a90512f36b04914d73cbf58317d953caea7c5/activemodel/lib/active_model/secure_password.rb#L122

還要注意, has_secure_password已經定義了默認密碼驗證,因此,如果要創建自己的密碼驗證,則需要使用has_secure_password validation: false調用它has_secure_password validation: false

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM