#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
beforeerrors.add
очень помогло.