自定义URI验证程序不起作用

时间:2012-11-19 20:11:27

标签: ruby-on-rails ruby

我是第一次尝试使用异常和自定义验证器。 当我将这个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

1 个答案:

答案 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