[英]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.