2012-09-09 14 views
6

Quiero crear una función de validación personalizada que no permita que un campo se guarde vacío/nulo solo si el campo actual no está vacío en la base de datos. ¿Cómo puedo acceder al valor de la base de datos (valor anterior) en la función de validación? Puedo acceder al nuevo valor usando self.name_of_field.Rieles: compare el valor antiguo y el nuevo valor durante la validación para editar

Esto es lo que tengo en este momento

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 

En este momento si trato de editar un objeto existente, no va a aceptar un nuevo valor de vacío, pero cuando se crea un nuevo objeto que va a decir "puede 't estar en blanco una vez configurado ", aunque el valor anterior nunca se estableció.

Respuesta

7

Puede aprovechar ActiveModel::Dirty. En su función de validación personalizada, puede verificar si el campo está vacío y si ha cambiado:

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, de Heroku, tiene un [breve artículo] (http://schneems.com/post/28425724540/get-previously-saved-changes-in-rails) discutiendo el método previous_changes, que también podría ayudarlo – stephenmurdoch

+0

Doesn ' ¿Pero esto solo funciona si el objeto realmente cambió? como en que se guardó con éxito. Solo estoy haciendo esto en un paso de validación –

+0

@glumbo pruébelo y vea – stephenmurdoch

Cuestiones relacionadas