2010-10-04 15 views
5

Ho un campo che è serializzato su YAML attraverso il comportamento AR predefinito. E 'attualmente in un array di hash per gli esempi:Convalida dei dati serializzati delle rotaie

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

C'è un senso che posso usare alcune convalide AR di base su alcuni di questi campi?

risposta

16

Sì, utilizzare il metodo 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 

Aggiunto: Non è possibile utilizzare le convalide, come validates_length_of dal momento che il metodo di convalida non capisce il formato del campo serializzato.

Il metodo validates_each è valido poiché consente di scrivere il proprio metodo di convalida. Il metodo può quindi aggiungere un errore al record, se appropriato.

Suggerimento: è inoltre possibile aggiungere un errore allo :base di record.errors anziché all'attributo specifico. A volte questo può aiutare con la formattazione dei messaggi di errore nelle viste.

1

Lasciando questo qui nel caso in cui aiuti chiunque in futuro - Ho scritto una gemma per gestire meglio la convalida degli attributi serializzati. Si può solo mettere quelle convalide in una sintassi di blocco, i modi si potrebbe aspettare di:

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

https://github.com/brycesenz/validates_serialized

Problemi correlati