我在我的模型与下面的验证void验证独特性:链接
validates_uniqueness_of :link, :case_sensitive => false
一个URL字段命名的链接当我把“http://stackoverflow.com”,一切顺利。 现在,当我把“https://stackoverflow.com/”(与尾随slach),这也被认为是唯一的。 但我希望它是无效的,尽管最后有“/”?
我在我的模型与下面的验证void验证独特性:链接
validates_uniqueness_of :link, :case_sensitive => false
一个URL字段命名的链接当我把“http://stackoverflow.com”,一切顺利。 现在,当我把“https://stackoverflow.com/”(与尾随slach),这也被认为是唯一的。 但我希望它是无效的,尽管最后有“/”?
我会建议您在将它们存储在数据库中甚至验证之前,对URL进行标准化(添加/剥离尾部斜杠等,请参阅http://en.wikipedia.org/wiki/URL_normalization)。
validates_uniqueness_of :link, :case_sensitive => false
before_validation :normalize_urls
def normalize_urls
self.link.strip!
self.link.gsub!(/\/$/,'')
end
这不是你问的很什么,但如果你不存储标准化的网址,您要查询验证过程中以及对所有可能的变化DB和可以迅速得到昂贵。
您可以自定义验证。见this railscast。
您可以随时执行自定义验证程序(例如,使用validate
方法)。
它可能是这个样子:
class MyModel < ActiveRecord::Base
validate :link_is_unique
def link_is_unique
#Clean up the current link (removing trailing slashes, etc)
link_to_validate = self.link.strip.gsub(/\/$/,'')
# Get the current count of objects having this link
count = MyModel.count(:conditions => ['link = ?', link_to_validate])
# Add an error to the model if the count is not zero
errors.add_to_base("Link must be unique") unless count == 0
end
end
然后,您可以添加其他逻辑,以清理链接(即检查HTTP:// WWW等)