rails自定义校验

来源:互联网 发布:部落冲突箭塔升级数据 编辑:程序博客网 时间:2024/05/20 05:30


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

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

自定义校验器

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

[ruby] view plaincopy在CODE上查看代码片派生到我的代码片
  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  
使用方法:
[ruby] view plaincopy在CODE上查看代码片派生到我的代码片
  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,代码如下:

[ruby] view plaincopy在CODE上查看代码片派生到我的代码片
  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  
扩展时继续追加定义类方法即可.
使用方法:
[ruby] view plaincopy在CODE上查看代码片派生到我的代码片
  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  

完成效果:

0 0
原创粉丝点击