我有一個通過默認的AR行爲序列化爲YAML的字段。它是目前在哈希值的例子爲數組:Rails序列化數據驗證
[{'name' => 'hi', 'url' => 'bye'},
{'name' => 'hi', 'url' => 'bye'},
{'name' => 'hi', 'url' => 'bye'}]
有沒有一種方法,我可以使用一些基本的AR驗證的一些這些領域的?
我有一個通過默認的AR行爲序列化爲YAML的字段。它是目前在哈希值的例子爲數組:Rails序列化數據驗證
[{'name' => 'hi', 'url' => 'bye'},
{'name' => 'hi', 'url' => 'bye'},
{'name' => 'hi', 'url' => 'bye'}]
有沒有一種方法,我可以使用一些基本的AR驗證的一些這些領域的?
是,使用該方法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
而不是特定屬性。有時這可以幫助您在視圖中格式化錯誤消息。
這裏留下這個以防萬一以後幫助任何人 - 我寫了一個gem來更好地處理驗證序列化屬性。你可以把這些驗證塊中的語法,你可能會想到辦法:
serialize :urls
validates_hash_keys :urls do
validates :name, presence: true
validates :url, presence: true
end