2010-10-04 24 views
5

Tengo un campo que se serializa a YAML a través del comportamiento de RA predeterminado. Actualmente se encuentra en una gama de valores hash para ejemplos:Validación de datos serializados de rieles

[{'name' => 'hi', 'url' => 'bye'}, 
{'name' => 'hi', 'url' => 'bye'}, 
{'name' => 'hi', 'url' => 'bye'}] 

¿Hay alguna manera de utilizar algunas validaciones básicas AR en algunos de estos campos?

Respuesta

16

Sí, utilice el método validates_each

serialize :urls 
validates_each :urls do |record, attr, value| 
    # value is an array of hashes 
    # eg [{'name' => 'hi', 'url' => 'bye'}, ...] 

    problems = '' 
    if value 
    value.each{|name_url| 
     problems << "Name #{name_url['name']} is missing its url. " \ 
     unless name_url['url']} 
    else 
    problems = 'Please supply at least one name and url' 
    end 
    record.errors.add(:urls, problems) unless problems.empty? 
end 

Agregado: No puede utilizar las validaciones como validates_length_of ya que el método de validación no entiende el formato de su campo en serie.

validates_each El método es bueno, ya que le permite escribir su propio método de validación. El método puede agregar un error al registro si corresponde.

Consejo: También puede agregar un error a la :base de record.errors en lugar de al atributo específico. A veces, esto puede ayudar con el formateo de los mensajes de error en sus vistas.

1

Dejando esto aquí en caso de que ayuda a cualquier persona en el futuro - He escrito una joya para manejar mejor la validación de atributos en serie. Usted puede simplemente poner esas validaciones en un bloque de sintaxis, las formas en que se podría esperar:

serialize :urls 
validates_hash_keys :urls do 
    validates :name, presence: true 
    validates :url, presence: true 
end 

https://github.com/brycesenz/validates_serialized

Cuestiones relacionadas