0

我第一次尝试使用异常和自定义验证器。当我把它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
4

1 回答 1

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
于 2012-11-19T20:18:47.393 回答