我第一次尝试使用异常和自定义验证器。当我把它begin ... end
放到单独的文件中时,它可以工作,但是对于我在 rspec 中的简单测试它没有。
这是我的模型的 url 验证:
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
但它仍然不起作用,这很有趣,因为我用单独的文件尝试过它,它工作正常输出错误的网址为 FALSE:
require 'uri'
begin
URI.parse("http://onet!!t.pl")
rescue URI::InvalidURIError
puts "FALSE"
end