Tôi có một mô hình ActiveRecord đang trả về true
từ valid?
(và .errors là trống), nhưng đang trả về false
từ save()
. Nếu phiên bản mô hình hợp lệ, làm cách nào để tìm ra nguyên nhân khiến quá trình lưu không thành công?
Tôi có một mô hình ActiveRecord đang trả về true
từ valid?
(và .errors là trống), nhưng đang trả về false
từ save()
. Nếu phiên bản mô hình hợp lệ, làm cách nào để tìm ra nguyên nhân khiến quá trình lưu không thành công?
Câu trả lời:
Kiểm tra tất cả các cuộc gọi lại của bạn.
Tôi đã gặp sự cố như thế này trong đó tôi có và phương pháp "after_validate" không thành công sau khi tôi thực hiện một loạt các thay đổi đối với mô hình. Mô hình hợp lệ nhưng "after_validate" trả về false, vì vậy nếu tôi sử dụng model.valid
nó cho biết true, nhưng sau đó nếu tôi lưu nó sẽ cho tôi lỗi xác thực (được chuyển qua từ lệnh gọi lại after_validate). Thật là kỳ lạ.
Nhìn vào dấu vết ứng dụng và bạn sẽ có thể biết dòng mã nào đang tạo ra ngoại lệ.
"Hey! That's MY fake leg!" # Believe it or not, this is important
. Không phải tôi sẽ làm điều đó. ;)
true.tap { do_something }
Hãy thử sử dụng phiên bản tiếng nổ save!
(có dấu chấm than ở cuối) và kiểm tra lỗi phát sinh.
save!
có thể tăng ActiveRecord::RecordInvalid
(vì nó chạy xác thực) hoặc ActiveRecord::RecordNotSaved
vì vậy đó là những gì bạn sẽ muốn giải cứu.
.save
lỗi không phải do xác thực. Tiêu chuẩn "ít không hài lòng nhất" đề cập đến Rails, không phải câu trả lời này.
Nếu @user.save
(ví dụ) trả về false
, thì chỉ cần chạy điều này để nhận tất cả các lỗi:
@user.errors.full_messages
Đúng vậy, tôi đã khắc phục sự cố này bằng cách đảm bảo rằng tôi trả về true trong tất cả các lần gọi lại before_ * của tôi sau đó nó bắt đầu hoạt động :)
Vấn đề tôi gặp phải là tôi đã quên thêm xác nhận vào mô hình.
class ContactGroup < ActiveRecord::Base
validates_presence_of :name
end