2010-10-04 6 views
5

Ich habe ein Feld, das durch das Standard-AR-Verhalten zu YAML serialisiert wird. Es ist derzeit in einem Array von Hashes für Beispiele:Serialisierte Datenvalidierungen von Schienen

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

Gibt es eine Weise, die ich auf einige dieser Felder einige grundlegende AR Validierungen verwenden kann?

Antwort

16

Ja, verwenden Sie die validates_each Methode

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 

Hinzugefügt: Sie können nicht die Validierungen verwenden wie validates_length_of da die Validierungsmethode das Format der serialisierten Feld nicht versteht.

Die Methode validates_each ist gut, da Sie damit Ihre eigene Validierungsmethode schreiben können. Die Methode kann dann dem Datensatz gegebenenfalls einen Fehler hinzufügen.

Tipp: Sie können auch einen Fehler in die Datei :base von record.errors anstelle des spezifischen Attributs einfügen. Manchmal kann dies bei der Formatierung der Fehlermeldungen in Ihren Ansichten helfen.

1

diese verlassen hier falls hilft es jemand in die Zukunft - ich ein Juwel geschrieben haben, besser zu behandeln serialisiert Attribute validieren. Sie können nur diese Validierungen in einem Block Syntax gesetzt, die Möglichkeiten, wie Sie erwarten könnten:

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

https://github.com/brycesenz/validates_serialized

Verwandte Themen