2010-10-04 52 views
5

我有一個通過默認的AR行爲序列化爲YAML的字段。它是目前在哈希值的例子爲數組:Rails序列化數據驗證

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

有沒有一種方法,我可以使用一些基本的AR驗證的一些這些領域的?

回答

16

是,使用該方法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 

新增:您不能使用驗證,如validates_length_of因爲驗證方法不理解你的序列化字段的格式。

validates_each方法很好,因爲它使您能夠編寫自己的驗證方法。如果合適,該方法可以將錯誤添加到記錄中。

提示:您還可以將錯誤添加到record.errors的:base而不是特定屬性。有時這可以幫助您在視圖中格式化錯誤消息。

1

這裏留下這個以防萬一以後幫助任何人 - 我寫了一個gem來更好地處理驗證序列化屬性。你可以把這些驗證塊中的語法,你可能會想到辦法:

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

https://github.com/brycesenz/validates_serialized