2010-12-28 32 views
8

Câu hỏi này xuất phát từ vấn đề của another question của tôi. Trong câu hỏi đó, tôi gặp một tình huống rằng hàm hasErrors() không hoạt động đối với lớp miền không liên tục, ngay cả sau tất cả những điều tôi đã làm theo sau the instruction, phần 7.5.Kết nối giữa validate() và hasErrors()

Theo cách của Victor, tôi đã khắc phục sự cố bằng cách gọi validate(), nhưng tôi không hiểu tại sao nó hoạt động. Các tài liệu Grails dường như không nói gì về bạn nên gọi hàm validate() trước hàm hasErrors(). Làm sao điều này xảy ra được?

Trả lời

9

Nó có ý nghĩa với tôi rằng validate sẽ cần phải được gọi trước khi hỏi một đối tượng cho dù đó hasErrors (hoặc save cho các đối tượng miền phù hợp, trong đó kêu gọi validate dưới bìa). Xác nhận trong ngữ cảnh này có nghĩa là "kiểm tra xem đối tượng này có hợp lệ hay không và chỉ ra bất kỳ lỗi nào nếu không". Ngoài ra, việc thực hiện GORM sẽ phải gọi validate mỗi lần thay đổi được thực hiện cho một đối tượng, điều này sẽ ít có hành vi mong muốn hơn, vì nó có thể liên quan đến rất nhiều công việc được thực hiện thường xuyên và không cần thiết liên quan đến rất nhiều công việc).

Bắt đầu phần 7.2 nêu rõ ràng "Để xác thực một lớp miền, bạn có thể gọi phương thức xác thực trên bất kỳ cá thể nào". Nó cũng nói rằng "trong Grails có hai giai đoạn xác nhận hợp lệ, giai đoạn đầu tiên là ràng buộc dữ liệu xảy ra khi bạn ràng buộc các tham số yêu cầu vào một cá thể như ... Tại thời điểm này bạn có thể đã có lỗi trong thuộc tính lỗi do loại chuyển đổi (chẳng hạn như chuyển đổi Strings thành Ngày) Bạn có thể kiểm tra chúng và lấy giá trị đầu vào ban đầu bằng cách sử dụng API lỗi ... Giai đoạn thứ hai của quá trình xác thực xảy ra khi bạn gọi xác nhận hợp lệ hoặc lưu. giá trị againts các ràng buộc bạn đã xác định. "

documentation for hasErrors cũng đề cập đến điều này. Bạn có thể truy cập điều này bằng cách tìm cuộc gọi phương thức trong khung điều hướng ở bên trái, khi bạn đang ở trên documentation site. Tôi sẽ luôn khuyên bạn nên xem các trang hướng dẫn này cũng như các trang hướng dẫn sử dụng mô tả hơn, vì chúng thường cung cấp thêm một chút chi tiết. Here's the page for the validate method quá.

Tôi chưa bao giờ gặp sự cố khi gọi trực tiếp validate - điều đó rất rõ ràng đối với tôi và tôi có thể chọn điểm mà tất cả công việc được thực hiện và tôi đã sẵn sàng để xác thực diễn ra. Tôi không thể thấy một tùy chọn để thay đổi hành vi này ở bất kỳ đâu, nhưng nếu bạn muốn tự động gọi là validate hoặc trong một số điều kiện nhất định, bạn có thể sử dụng ma thuật lập trình meta Groovy bằng cách thêm invokeMethod vào lớp và gọi nó validate trước khi vượt qua một số cuộc gọi nhất định. Có một cái nhìn herehere. (Không chắc chắn tôi sẽ đề nghị rằng mặc dù! Và nhớ rằng lớp học của bạn bây giờ sẽ phụ thuộc vào được sử dụng trong khuôn khổ xác nhận GORM, vì phương pháp validate có thể không tồn tại).

+0

Rất cám ơn câu trả lời cẩn thận của bạn, tôi hiểu ngay bây giờ. –

+2

Nhân tiện ... Peter Ledbrook (một trong những tác giả của cuốn sách Grails in Action tuyệt vời) đã viết một loạt các bài viết về GORM Gotchas - rất đáng đọc để có được đầu của bạn xung quanh một số chi tiết về cách tất cả điều này hoạt động: [phần 1] (http://blog.springsource.com/2010/06/23/gorm-gotchas-part-1/), [phần 2] (http://blog.springsource.com/2010/ 07/02/gorm-gotchas-part-2 /) và [phần 3] (http://blog.springsource.com/2010/07/28/gorm-gotchas-part-3/). –

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