Пользовательская проверка MongoMapper

#ruby #validation #mongomapper

#ruby #проверка #mongomapper

Вопрос:

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

Ответ №1:

Если вы используете 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
  

Не уверен, работает ли этот код с gem 0.8.6, но это возможно.

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

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

Комментарии:

1. Похоже, это не работает с тем драгоценным камнем, который у меня есть. Однако я не собираюсь пытаться создавать gem из исходного кода.

2. Ага — избавление от return false before errors.add очень помогло.