2013-01-23 21 views
24

Tôi khá mới với Rails và đã tìm thấy một đoạn mã nhỏ để xác thực tính hiện diện và tính độc đáo từng bước: kiểm tra trước sự hiện diện, sau đó kiểm tra tính duy nhất.Hiểu xác nhận Rails: allow_blank làm gì?

validates :email, :presence => true, :allow_blank => true, :uniqueness => { :case_sensitive => false } 

Tôi hơi bối rối khi sử dụng presence => trueallow_blank => true cùng nhau.

Nếu không sử dụng allow_blank => true cả hai quy tắc sẽ được kiểm tra cùng một lúc và không phải từng bước.

Tại sao allow_blank => true thực hiện phép thuật này?

+7

trong hướng dẫn chính thức có nội dung ": allow_blank bị bỏ qua bởi trình xác thực hiện diện". Có lẽ điều này sẽ giúp. –

+1

cũng có một cái nhìn [câu trả lời tuyệt vời này] (http://stackoverflow.com/a/1655001/1371131) – weltschmerz

Trả lời

20

gì bạn đã có tương đương với này (bọc cho rõ ràng):

validates :email, :presence => true, 
      :uniqueness => { :allow_blank => true, :case_sensitive => false } 

Đó là một chút ngớ ngẩn dù vì nếu bạn đang đòi hỏi phải có sự hiện diện, sau đó sẽ "vô hiệu hóa" các: allow_blank khoản tới: tính duy nhất.

Điều này có ý nghĩa hơn khi bạn chuyển sang sử dụng trình xác thực khác .. nói ... định dạng và tính duy nhất, nhưng bạn không muốn bất kỳ kiểm tra nào nếu nó trống. Trong trường hợp này, thêm một "áp dụng toàn cầu": allow_blank có ý nghĩa hơn và DRY của mã lên một chút.

này ...

validates :email, :format => {:allow_blank => true, ...}, 
        :uniqueness => {:allow_blank => true, ...} 

có thể được viết như sau:

validates :email, :allow_blank => true, :format => {...}, :uniqueness => {...} 
+0

Cảm ơn rất nhiều! Tôi chỉ tìm thấy đoạn này ở đâu đó trên stackoverflow và trở nên tò mò tại sao ai đó nên sử dụng 'allow_blank' và' presence' cùng nhau :) – Slevin

+0

bạn có thể muốn sử dụng chúng cùng nhau để hiển thị một thông báo lỗi khác nhau cho định dạng không hợp lệ so với trống chẳng hạn. Nếu bạn không đặt allow_blank, bạn sẽ nhận được "định dạng không hợp lệ" cho một giá trị trống – montrealmike

6

:allow_blank là một lựa chọn mà sẽ "vô hiệu hóa" một số các xác nhận, nhưng không phải là sự hiện diện validator. Kết quả của việc sử dụng hai trường hợp này là khi trường được để trống, bạn sẽ nhận được thông báo lỗi :blank (tức là "không được để trống"), nhưng không phải là các thông báo lỗi khác.

31

Sự khác biệt sau đây có thể có ích cho biết:

presence: true     # nil and empty string fail validation 
presence: true, allow_blank: true # nil fails validation, empty string passes 
+3

Điều đó có đúng không? Theo như tôi hiểu tài liệu, allow_blank sẽ bỏ qua các xác thực trên tất cả các giá trị trống. 'nil' là một giá trị trống. Một bài kiểm tra nhanh trên Rails 5 cho tôi biết rằng 'nil' không thất bại trong việc xác thực của tôi ... – NobodysNightmare

+2

Câu trả lời này là siêu WRONG! Ít nhất trong Rails 5. – dferrazm

0

từ Rails chú thích

# * <tt>:allow_nil</tt> - Skip validation if the attribute is +nil+. 
# * <tt>:allow_blank</tt> - Skip validation if the attribute is blank. 

như vậy, nó có nghĩa là khi chúng ta sử dụng allow_blank trên email, nếu email là con số không , chỉ có một lỗi được thêm vào đối tượng errors, hãy nhảy tính duy nhất xác thực.

Các vấn đề liên quan