ActiveRecord验证url是否存在

时间:2014-07-09 16:06:36

标签: ruby-on-rails ruby-on-rails-4 rails-activerecord

我想确保我的班级url属性有值,如果有,则有效:

class Entity < ActiveRecord::Base

  validates :name, presence: true
  validates :url, presence: true, :format => {:with => URI.regexp}

end

在rails控制台中:

> e = Entity.new(name: 'foo')
=> #<Entity id: nil, name: "foo", url: nil, created_at: nil, updated_at: nil> 

导致url属性出现两个错误:

> e.valid?
=> false

> e.errors
=> #<ActiveModel::Errors:0x007fed9e324e28 @base=#<Entity id: nil, name: "foo", url: nil, created_at: nil, updated_at: nil>, @messages={:url=>["can't be blank", "is invalid"]}> 

理想情况下,nil url会产生一个错误(即can't be blank)。

因此,我更改了validates规则:

validates :url, presence: true, :with => Proc.new { URI.regexp if :url? }
但是,我无法使用语法。我错过了什么?

2 个答案:

答案 0 :(得分:18)

分开两个验证器。

validates :url, presence: true
validates :url, format: { with: URI.regexp }, if: Proc.new { |a| a.url.present? }

(差不多)2周年纪念日

正如vrybas和Barry所说,Proc是不必要的。您可以像这样编写验证器:

validates :url, presence: true
validates :url, format: { with: URI.regexp }, if: 'url.present?'

答案 1 :(得分:6)

按照Yanis的答案分开验证器,但是你不需要Proc。

通过设置format参数,如果值为nil,您可以使用common validation options来绕过allow_nil验证。

或者,如果值为空字符串allow_blank,则设置''参数也会有效,如果您从表单输入中设置url,这可能会更有用

完整的验证器可能如下所示:

validates :url, presence: true
validates :url, format: { with: URI.regexp }, allow_blank: true