我的模型中有一个名为link的url字段,带有以下验证
validates_uniqueness_of :link, :case_sensitive => false
当我输入“http://stackoverflow.com”时,它会顺利进行。 现在,当我把“https://stackoverflow.com/”(带有尾随的slach)时,这也被认为是唯一的。 但是我觉得它虽然最后有“/”但却无效?
答案 0 :(得分:2)
我建议您在将数据存储到数据库之前甚至在验证之前规范化您的网址(添加/删除尾部斜杠等,请参阅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
这不是您要求的,但如果您不存储规范化的网址,则必须在验证期间查询您的数据库以查找所有可能的变化,这可能会很快变得昂贵。
答案 1 :(得分:1)
您可以随时使用自定义验证程序(例如,使用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等)
答案 2 :(得分:0)
您可以自定义验证。请参阅this railscast。