rails自定义校验

本文介绍了在Rails中如何创建自定义验证器,通过ActiveModel::EachValidator实现针对属性的验证。同时,为了在多个模型中复用校验逻辑,文章还展示了如何创建校验辅助方法,具体步骤是在config/initializers目录下创建extend_validate.rb文件并编写相关代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当内建的校验 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

完成效果:







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值