2013-08-09 23 views
38

Tôi đã thêm một xác nhận cho một đối tượng sử dụng:Sự khác biệt giữa "xác thực" và "xác thực" là gì?

validate :field, presence: true 

tôi thấy họ không đưa ra các thông báo lỗi. Tôi đã đổi chúng thành validates và nhận được thông báo lỗi. This ticket có liên quan.

Tôi cố gắng thêm một xác nhận tùy chỉnh với validates và có một lỗi:

You need to supply at least one validation 

tôi đã thay đổi nó để validate, và tất cả mọi thứ đã đi cùng như mong đợi.

Hiểu biết của tôi là sử dụng validates có xác thực thông thường và validate với tùy chỉnh. Có đúng không? Có bất kỳ phần nào khác mà tôi nên biết không? Có cách nào để có vấn đề đầu tiên không lớn tiếng và không chỉ xác nhận tất cả mọi thứ?

+0

lẽ là một là cú pháp hợp lệ tùy chỉnh 'validate' và khác là chung chung xác nhận' validates' cú pháp – Viren

+0

@Viren - tôi chỉ tự hỏi nếu tôi bỏ lỡ bất cứ điều gì khác. Tôi đã không thể tìm thấy một lời giải thích rõ ràng về hai và tôi hy vọng SO có thể cung cấp. Tôi đồng ý, đó là sự khác biệt duy nhất tôi đã tìm thấy cho đến nay. –

+0

Tôi trả lời nó giữ tâm vấn đề của ngọn hải đăng :) – Viren

Trả lời

54

xác thực Phương thức này là lối tắt cho tất cả trình xác thực mặc định và bất kỳ lớp xác thực tùy chỉnh nào kết thúc bằng ‘Trình xác thực’. Lưu ý rằng Rails mặc định validators có thể được ghi đè bên trong các lớp học cụ thể bằng cách tạo ra các lớp validator tùy chỉnh ở vị trí của họ như PresenceValidator.

validates :title, :body, :presence => true 

Validate, Thêm một phương pháp xác nhận hoặc khối lớp. Điều này hữu ích khi ghi đè phương thức cá thể hợp lệ trở nên quá khó sử dụng và bạn đang tìm kiếm thêm khai báo mô tả về xác thực của mình.

validate :must_be_friends 

    def must_be_friends 
    errors.add(:base, 'Must be friends to leave a comment') unless commenter.friend_of?(commentee) 
    end 
+0

trong số 'tò mò' mà doc bạn có thể đính kèm liên kết và cũng đã làm bạn thử nghiệm nó AFAIK nó không hoạt động – Viren

+0

sửa đổi câu trả lời của tôi :) này: http: // apidock .com/rails/ActiveModel/Validations/ClassMethods/validates Tôi đã đọc các ví dụ thấp hơn và đó là những gì tôi hiểu, nhưng có vẻ như tôi đã sai. Các mô tả chi tiết hơn http://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html – rmagnum2002

+1

Ồ, tôi không biết về "các lớp trình xác nhận tùy chỉnh kết thúc bằng" Validator "" bit, điều đó thực sự tốt để biết . Tôi sẽ để câu hỏi mở lâu hơn một chút trong trường hợp các câu trả lời khác xuất hiện, nhưng tôi sẽ quay lại sau để chấp nhận. Cảm ơn lời giải thích! –

6

Tôi tin rằng việc kê khai :validate được sử dụng cho tùy chỉnh xác nhận nơi như :validates được sử dụng cho generic xác nhận như presence, uniqueness etc trên một sân

Phương pháp validate tìm kiếm một phương thức với tên của tham số, tức là nếu bạn làm validate :field, nó sẽ tìm kiếm

def field 

end 

trên số object của bạn. Vì Rails định nghĩa một attr_accessor cho mọi cơ sở dữ liệu field các validate :field sẽ gọi phương thức đọc của field.

Nếu chức năng xác nhận trả true hoặc nếu có một đối tượng error, tức là object.errors không phải là trống rỗng, sau đó các đối tượng được coi valid?

Do đó lý do tại ligthouse vấn đề, họ phàn nàn rằng validatesilently bypasses xác nhận :)

Hy vọng điều này có ý nghĩa

+0

Ah, cảm ơn lời giải thích đó! Tôi đã không nghĩ về nó theo cách đó, nhưng nó hoàn toàn có ý nghĩa. Nó cũng giải thích lý do tại sao bạn không thể có ': validate' thất bại" lớn tiếng "vì nó hoàn toàn hợp lý (thậm chí có thể nói" hợp lệ "...) gọi để thực hiện. Tôi đã không nghĩ về nó như thế. –

+0

** Điều này cực kỳ quan trọng. ** _Seriously_ kết quả không mong muốn chỉ là một ký tự đơn. Cảm ơn bạn đã không chỉ đăng bài "gotcha" mà là khoa học đằng sau nó. Chúc mừng! –

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