当前位置: 首页> 财经> 股票 > 营销系统官网_商城在线_武汉搜索推广_淘宝客推广

营销系统官网_商城在线_武汉搜索推广_淘宝客推广

时间:2025/8/24 6:42:10来源:https://blog.csdn.net/qq_41037744/article/details/124111738 浏览次数:0次
营销系统官网_商城在线_武汉搜索推广_淘宝客推广

Validations

  • 类方法
  1. validate 自定义验证方法 (不需要属性,也不需要校验器;直接做校验)
class Invoice < ApplicationRecordvalidate :active_customer, on: :createdef active_customererrors.add(:customer_id, "is not active") unless customer.active?end
end
  1. validates 和 validates! (需要属性,也需要校验器;间接做校验)

class Person < ApplicationRecordvalidates :name, presence: true #校验器是PresenceValidator
end#校验器PresenceValidator
class PresenceValidator < ActiveModel::EachValidatordef validate_each(record, attribute, value)record.errors.add attribute, "can't be blank" if value.blank?end
end
  1. validates_each (需要属性,不需要校验器;直接做校验)
class Person < ApplicationRecordvalidates_each :name, :surname do |record, attr, value|record.errors.add(attr, 'must start with upper case') if value =~ /\A[[:lower:]]/end
end
  1. validates_with 验证交给其他类做验证 (不需要属性,需要校验器;作用于所有对象,间接做校验)
class GoodnessValidator < ActiveModel::Validatordef validate(record)# options = { :fields => [:first_name, :last_name] }# options = { :abc => [:first_name, :last_name] }if options[:fields].any?{|field| record.send(field) == "Evil" }record.errors[:base] << "This person is evil"endend
endclass Person < ApplicationRecord#fields是options哈希的一个key,也可以是别的例如 abc: [:first_name, :last_name]validates_with GoodnessValidator, fields: [:first_name, :last_name]
end

经验:牢记 validate 发生在 save 之前,如果你喜欢用 before_save 之类的进行检验,记得加上 return false 或者改变习惯,用 validate :validate_method 类似写法进行校验。

Validator

  • 自定义验证类(校验器)
  1. 自定义的验证类继承自 ActiveModel::Validator,必须实现 validate 方法,其参数是要验证的记录,然后验证这个记录是否有效。自定义的验证类通过 validates_with 方法调用
class MyValidator < ActiveModel::Validatordef validate(record)unless record.name.starts_with? 'X'record.errors[:name] << 'Need a name starting with X please!'endend
endclass Personinclude ActiveModel::Validationsvalidates_with MyValidator
end
  1. 自定义的验证类中验证单个属性,最简单的方法是继承 ActiveModel::EachValidator 类。此时,自定义的验证类必须实现 validate_each 方法。这个方法接受三个参数:记录、属性名和属性值。它们分别对应模型实例、要验证的属性及其值。
class EmailValidator < ActiveModel::EachValidatordef validate_each(record, attribute, value)unless value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/irecord.errors[attribute] << (options[:message] || "is not an email")endend
endclass Person < ApplicationRecord# presence: true为内置的验证类,email: true为自定义的验证类,可以同时使用# email: true 对应的验证类必须是EmailValidator, title:true 对应的验证类必须是TitlelValidatorvalidates :email, presence: true, email: true
end
  • 自定义验证方法
    自定义验证方法必须使用类方法 validate 注册,传入自定义验证方法名的符号形式
    这个类方法可以接受多个符号,自定义的验证方法会按照注册的顺序执行
    可以设置 :on 选项,指定什么时候验证。:on 的可选值为 :create 和 :update。
class Invoice < ApplicationRecordvalidate :expiration_date_cannot_be_in_the_past,:discount_cannot_be_greater_than_total_valuedef expiration_date_cannot_be_in_the_pastif expiration_date.present? && expiration_date < Date.todayerrors.add(:expiration_date, "can't be in the past")endenddef discount_cannot_be_greater_than_total_valueif discount > total_valueerrors.add(:discount, "can't be greater than total value")endend
end
  • valid? 校验是否通过,只有一个判断规则:当前 record 对象的 errors 值是否为空 errors.empty?
    所以自己写校验方法或者校验器的时候,请记得设置 errors 的值。

Concern实现

# app/models/concerns/custom_validatable.rb
module CustomValidatableextend ActiveSupport::Concernincluded dovalidate :custom_validateenddef validate_custom_fields(fields)CustomValidation.order(:position).each do |validation|regex = Regexp.new(validation.regex)fields.each do |field|value = send(field)unless value.match?(regex)errors.add(field, validation.error_message)endendendend
end
# app/models/issue.rb
include CustomValidatable
def custom_validatevalidate_custom_fields(['subject', 'description'])
end

validates_with实现

class WxMsgSecValidator < ActiveModel::Validator# scene: 1 scene_profile 资料, 2 scene_comment 评论, 3 scene_post 论坛, 4 scene_log 社交日志def validate(record)if options[:fields].select { |field| record.send("#{field}_changed?") }.present?case record.class.namewhen 'YouKe'@you_ke = recordelse@you_ke = record.you_keendscene_hash = { desc: 2, content: 2 }@you_ke = YouKe.where(is_robot: false).first if @you_ke&.is_robot?open_id = @you_ke&.klly? ? @you_ke&.open_id : @you_ke&.wmh_open_idreturn record.errors[:base] << '账号openid不存在' if open_id.nil?options[:fields].select { |field| record.send("#{field}_changed?") }.each do |field|if record.send(field).present?is_deny = @you_ke.klly? ? !Weixin.msg_check(scene_hash[field], open_id, record.send(field)) : !WmhWeixin.msg_check(scene_hash[field], open_id, record.send(field))record.errors.add(:base, '输入涉嫌违规') if is_denyendendendend
end
# app/models/issue.rbinclude ActiveModel::Validationsvalidates_with WxMsgSecValidator, fields: %i[content]
关键字:营销系统官网_商城在线_武汉搜索推广_淘宝客推广

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: