Пользовательская проверка MongoMapper - PullRequest
2 голосов
/ 10 апреля 2011

У меня есть этот класс ruby ​​с массивом ссылок.Теперь я могу сохранить объект Paper, даже если массив содержит ссылки, которые не являются действительными URL-адресами.У меня есть метод, который проходит через массив и проверяет URL-адреса и возвращает ложь, если URL-адрес является недействительным.Но я хочу получить сообщение об ошибке при попытке вызвать 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 Ответ

5 голосов
/ 11 апреля 2011

Если вы используете MongoMapper из GitHub (который поддерживает 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, но может.

Кроме того, это не применимо в этом случае, но если бы это был не массив, вы могли бы разбить все это в одну строку:

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