验证链接的唯一性:

时间:2010-01-24 09:55:58

标签: ruby-on-rails validation

我的模型中有一个名为link的url字段,带有以下验证

validates_uniqueness_of :link, :case_sensitive => false

当我输入“http://stackoverflow.com”时,它会顺利进行。 现在,当我把“https://stackoverflow.com/”(带有尾随的slach)时,这也被认为是唯一的。 但是我觉得它虽然最后有“/”但却无效?

3 个答案:

答案 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