2012-05-30 33 views
20

Nếu bạn cần mã xác nhận phức tạp đáng kể, lỗi đôi khi không nằm trong một thuộc tính cụ thể, nhưng trong một sự kết hợp của một số thuộc tính. Ví dụ: nếu tôi muốn xác thực rằng khoảng thời gian giữa: start_date và: end_date không chứa bất kỳ chủ nhật nào, lỗi không thuộc về một trong hai trường đó, nhưng phương pháp thêm lỗi yêu cầu chỉ định nó.Có thể thêm lỗi vào đối tượng ActiveRecord mà không liên kết chúng với thuộc tính cụ thể không?

Trả lời

29

Hãy thử làm một cái gì đó như thế này:

# Your Model.rb 
validate :my_own_validation_method 

... 

private 

def my_own_validation_method 
    if there_is_no_sunday_in_the_range 
     self.errors[:base] << "You must have a Sunday in the time range!" 
    end 
end 

Về cơ bản, bạn có thể thêm kiểm chứng thực phức tạp của riêng bạn để một mô hình, và khi bạn nhìn thấy điều gì đó sai lầm đã xảy ra, bạn có thể thêm một chuỗi lỗi trong mảng lỗi.

+1

Tuyệt vời, đây chỉ là những gì tôi cần. Không thể tìm thấy nó trong tài liệu –

+2

Điều gì là: cơ sở trong băm lỗi? – holaSenor

+4

Cũng bình thường, bạn có thể thêm lỗi vào một thuộc tính cụ thể. Ví dụ: nếu bạn có mô hình 'Người dùng' có thuộc tính' tuổi', bạn có thể muốn thêm lỗi cho thuộc tính đó, vì vậy bạn sẽ viết 'self.errors [: age] <<" không được nhỏ hơn 0 "' sẽ tạo ra lỗi như "Độ tuổi không được nhỏ hơn 0". Nhưng nếu lỗi không phải là về bất kỳ thuộc tính cụ thể nào, bạn có thể thêm nó vào cơ sở, tức là với chính mô hình đó. Vì vậy, 'self.errors [: base] <<" Mọi thứ đều sai! "' Làm cho thông báo lỗi "Mọi thứ đều sai!"; nó không được kết nối với bất kỳ thuộc tính cụ thể nào. – MrDanA

5

Bạn có thể sử dụng errors[:base] để thêm các lỗi chung không được liên kết cụ thể với một thuộc tính - rails guide link.

7
model_instance.errors[:base] << "msg" 
1

Bạn thực sự có thể đặt tên cho khóa băm bất cứ điều gì bạn muốn:

instance.errors[:case_of_the_sundays] << "Error, son." 

mô tả nhiều hơn Chỉ cần một chút.

0

Câu trả lời ở trên đã lỗi thời. Đối với Rails 5 trở lên, bạn cần gọi phương thức ActiveModel::Errors add với tham số đầu tiên là :base. Xem ví dụ bên dưới.

model_instance.errors.add(
    :base, 
    :name_or_email_blank, 
    message: "either name or email must be present" 
) 
Các vấn đề liên quan