cra*_*aig 4 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"]}> 
理想情况下,a nil url会产生单个错误(即can't be blank).
因此,我改变了validates规则:
validates :url, presence: true, :with => Proc.new { URI.regexp if :url? }
但是,我无法使语法工作.我错过了什么?
Yan*_*lly 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?'
按照Yanis的答案分开验证器,但是你不需要Proc.
如果值是通过设置参数,则可以使用公共验证选项绕过format验证.nilallow_nil
或者,allow_blank如果值为空字符串'',则设置参数也会起作用,如果您url从表单输入进行设置,这可能更有用.
完整的验证器可能如下所示:
validates :url, presence: true
validates :url, format: { with: URI.regexp }, allow_blank: true
| 归档时间: | 
 | 
| 查看次数: | 8183 次 | 
| 最近记录: |