我想确保我的班级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? }
但是,我无法使用语法。我错过了什么?
答案 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