其中,当有比较通用的规则需要校验时,优先考虑使用自定义校验器.
自定义校验器
给需要校验的单独属性添加自定义校验器最便捷的方法是使用 ActiveModel::EachCalidator。这种情况下,自定义校验类必须实现一个 validate_each 方法,它接受三个参数:record,attribute 和 value,它们分别代表model对象实例,被校验的属性和被校验属性的值。
- class DateValidator < ActiveModel::EachValidator
- def validate_each(record, attribute, value)
- if options[:after]
- unless record[options[:after]] < value
- record.errors[attribute] << options[:after_message]
- end
- end
- if options[:before]
- unless record[options[:before]] > value
- record.errors[attribute] << options[:before_message]
- end
- end
- end
- end
- class XXX < ActiveRecord::Base
- ......
- validates_numericality_of :price
- #定义日期之间关系
- validates :end_at, :date => {:after => :start_at, :after_message => "结束时间不能早于开始时间"}
- ......
- end
创建校验helper
创建自己的校验helpers,以便在多个model中复用.
在config/initializers文件夹下创建文件extend_validate.rb,代码如下:
- ActiveRecord::Base.class_eval do
- def self.validates_date_of(*attr_names)
- validates_with DateValidator, _merge_attributes(attr_names)
- end
- end
使用方法:
- class XXX < ActiveRecord::Base
- ......
- validates_numericality_of :price
- #定义日期之间关系
- validates_date_of :end_at ,:after=> :start_at,:after_message => "结束时间不能早于开始时间")
- ......
- end
完成效果: