MongoMapper自定义验证

时间:2011-04-10 09:16:50

标签: ruby validation mongomapper

我有一个带有一系列链接的ruby类。因为现在我可以保存Paper对象,即使该数组包含的链接不是有效的URL。我有一个方法贯穿数组并验证网址,如果网址无效,则返回false。但是当我尝试调用Paper.save时,我想收到一条错误消息。这可能吗?

class Paper
  include MongoMapper::Document

  key :links,       Array

  validates_presence_of :links

  def validate_urls
    reg = /^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$/ix
    status = []
    links.each do |link|
      if link.match(reg)
        status.push('true')
      else
        if "http://#{link}".match(reg)
          status.push('true')
        else
          status.push('false')
        end
      end
    end
    if status.include?('false')
      return false
    else
      return true
    end
  end

end

1 个答案:

答案 0 :(得分:5)

如果您正在使用GitHub中的MongoMapper(支持ActiveModel),请参阅http://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html#method-i-validate

class Paper
  include MongoMapper::Document

  key :links,       Array

  validates_presence_of :links
  validate :validate_urls

  def validate_urls
    reg = /^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$/ix
    status = []
    links.each do |link|
      if link.match(reg)
        status.push('true')
      else
        if "http://#{link}".match(reg)
          status.push('true')
        else
          status.push('false')
        end
      end
    end
    if status.include?('false')

      # add errors to make the save fail
      errors.add :links, 'must all be valid urls'

    end
  end

end

不确定该代码是否适用于0.8.6 gem但可能。

此外,它不适用于这种情况,但如果它不是一个数组,你可以将它全部粉碎成一行:

key :link, String, :format => /your regex here/