rails自定义校验

178 篇文章 0 订阅


当内建的校验 helpers 不能满足项目需求时,可以根据具体需求来编写自己的校验器或者校验方法。

其中,当有比较通用的规则需要校验时,优先考虑使用自定义校验器.

自定义校验器

给需要校验的单独属性添加自定义校验器最便捷的方法是使用 ActiveModel::EachCalidator。这种情况下,自定义校验类必须实现一个 validate_each 方法,它接受三个参数:record,attribute 和 value,它们分别代表model对象实例,被校验的属性和被校验属性的值。

  1. class DateValidator < ActiveModel::EachValidator  
  2.   def validate_each(record, attribute, value)  
  3.     if options[:after]  
  4.       unless record[options[:after]] < value  
  5.         record.errors[attribute] << options[:after_message]  
  6.       end  
  7.     end  
  8.   
  9.     if options[:before]  
  10.       unless record[options[:before]] > value  
  11.         record.errors[attribute] << options[:before_message]  
  12.       end  
  13.     end  
  14.   end  
  15. end  
使用方法:
  1. class XXX < ActiveRecord::Base  
  2.  ......  
  3.   validates_numericality_of  :price  
  4.   #定义日期之间关系  
  5.   validates :end_at:date => {:after => :start_at:after_message => "结束时间不能早于开始时间"}  
  6.  ......  
  7. end  
如上例所示,可以将校验helpers(validates_numericality_of )和自定义校验结合在一起使用。

创建校验helper
创建自己的校验helpers,以便在多个model中复用.

在config/initializers文件夹下创建文件extend_validate.rb,代码如下:

  1. ActiveRecord::Base.class_eval do  
  2.   def self.validates_date_of(*attr_names)  
  3.     validates_with DateValidator, _merge_attributes(attr_names)  
  4.   end  
  5. end  
扩展时继续追加定义类方法即可.
使用方法:
  1. class XXX < ActiveRecord::Base  
  2.  ......  
  3.   validates_numericality_of  :price  
  4.   #定义日期之间关系  
  5.   validates_date_of :end_at ,:after=> :start_at,:after_message => "结束时间不能早于开始时间")  
  6.  ......  
  7. end  

完成效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值