2012-09-09 34 views
6

Tôi muốn tạo chức năng xác thực tùy chỉnh sẽ không cho phép trường được lưu trống/không nếu trường hiện tại không trống trong cơ sở dữ liệu. Làm cách nào để truy cập giá trị cơ sở dữ liệu (giá trị cũ) trong hàm xác thực? Tôi có thể truy cập giá trị mới bằng self.name_of_field.Đường ray: So sánh giá trị cũ và giá trị mới trong quá trình xác nhận chỉnh sửa

Đây là những gì tôi có ngay bây giờ

validate :image_remote_url_change 
    def image_remote_url_change 
    if self.image_remote_url.blank? and self.image_remote_url_changed? 
     errors.add(:field, "can't be blank once set") 
     return false 
    end 
    end 

Ngay bây giờ nếu tôi cố gắng chỉnh sửa một đối tượng đang tồn tại, nó sẽ không chấp nhận một giá trị mới của sản phẩm nào nhưng khi tạo một đối tượng mới nó sẽ nói "có thể không được để trống khi đã đặt "mặc dù giá trị cũ chưa bao giờ được đặt.

Trả lời

7

Bạn có thể tận dụng lợi thế của ActiveModel::Dirty. Trong chức năng xác thực tùy chỉnh của bạn, bạn có thể kiểm tra xem trường có trống không và nếu nó đã thay đổi:

validate :custom_validation_function 

def custom_validation_function 
    if self.field.blank? and self.field_changed? 
     errors.add(:field, "can't be blank once set") 
     return false 
    end 
end 
+2

+1. Schneems, từ Heroku, có một [bài viết ngắn] (http://schneems.com/post/28425724540/get-previously-saved-changes-in-rails) thảo luận về phương pháp before_changes, có thể giúp bạn quá – stephenmurdoch

+0

Doesn ' t điều này chỉ làm việc mặc dù nếu đối tượng thực sự thay đổi? như trong nó đã được lưu thành công. Tôi chỉ làm điều này trên bước xác thực –

+0

@glumbo hãy dùng thử và xem – stephenmurdoch

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