我是第一次尝试使用异常和自定义验证器。
当我将这个begin ... end
放入单独的文件中时,它可以工作,但是对于我在rspec中的简单测试,它没有。
这是我模型的网址验证:
validates_each :url do |record,attr,value|
begin
!!URI.parse(value)
rescue URI::InvalidURIError
record.errors.add(attr, 'invalid url format')
end
end
rspec(我在这里有效,应该无效):
describe Entry do
before do
@entry = Entry.new(title: "Post Title", url: "http://google.com", content: "lorem ipsum")
end
subject {@entry}
it {should be_valid}
(other tests)
describe "when url has wrong format" do
it "should be invalid" do
invalid_urls = %w[^net.pl p://yahoo.com]
invalid_urls.each do |url|
@entry.url = url
@entry.should_not be_valid
end
end
end
end
我把它放在单独的文件apps / validators / uri_format_validator.rb
class UriFormatValidator < ActiveModel::EachValidator
def validate_each(record,attribute,value)
URI.parse(value)
rescue URI::InvalidURIError
record.errors[attribute] << "is not an URL format"
end
end
并且它仍然不起作用,这很有趣,因为我尝试使用单独的文件,并且对于错误的URL它可以正常输出FALSE:
require 'uri'
begin
URI.parse("http://onet!!t.pl")
rescue URI::InvalidURIError
puts "FALSE"
end
答案 0 :(得分:0)
我认为自定义验证器必须使用ActiveModel::EachValidator
方法继承validate_each
,例如。
class AllGoodValidator < ActiveModel::EachValidator
def validate_each(object, attribute, value)
if <some-test-that-fails-the-validation>
object.errors[attribute] << (options[:message] || "is not all good")
end
end
end
然后可以在您的模型中使用,以及其他常规验证,例如
validates :something, :presence => true, :all_good => true