当内建的校验 helpers 不能满足项目需求时,可以根据具体需求来编写自己的校验器或者校验方法。
使用方法:
其中,当有比较通用的规则需要校验时,优先考虑使用自定义校验器.
自定义校验器
给需要校验的单独属性添加自定义校验器最便捷的方法是使用 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
如上例所示,可以将校验helpers(validates_numericality_of )和自定义校验结合在一起使用。
创建校验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
完成效果: