`
jiajie0531
  • 浏览: 29399 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Active Record Validations 6 Performing Custom Validations 执行个性化校验

阅读更多

version Rails 4.1

6. 执行个性化校验
当内建的校验辅助方法不能满足你的需求时, 你能够写你自己更喜欢的校验类或者校验方法.
 

6.1 Custom Validators 个性化校验

个性化校验是类(class), 该类继承ActiveModel::Validator. 这些类必须实现一个validate方法, 它会带入一个record作为一个参数, 然后对这个record执行校验. 个性化校验是通过使用 validates_with 方法来被调用的.
class MyValidator < ActiveModel::Validator
  def validate(record)
    unless record.name.starts_with? 'X'
      record.errors[:name] << 'Need a name starting with X please!'
    end
  end
end
 
class Person
  include ActiveModel::Validations
  validates_with MyValidator
end

对于校验各个属性增加个性化校验最简单的方式是用ActiveModel::EachValidator的规则. 在这个例子中, 个性化校验类必须实现一个validate_each方法, 该方法有三个参数: record, attribute和value, 和实例相对应, 被校验的属性和属性的值都存在于被传入方法的实例中.

class EmailValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    unless value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
      record.errors[attribute] << (options[:message] || "is not an email")
    end
  end
end
 
class Person < ActiveRecord::Base
  validates :email, presence: true, email: true
end

正如在例子中显示的, 你同样结合标准的校验和你自己个性化的校验.

 

6.2 Custom Methods 个性化方法

你也能够创建方法来校验你模型的状态以及给errors集合增加信息, 当他们是无效的时候. 然后你必须要注册这些方法, 通过使用validate类的方法, 传入标志, 即校验方法名.

 

对于每一个方法你能够传入多于一个的标志, 各自的校验将会在同一个指令中运行, 正如他们被注册时那般.

class Invoice < ActiveRecord::Base
  validate :expiration_date_cannot_be_in_the_past,
    :discount_cannot_be_greater_than_total_value
 
  def expiration_date_cannot_be_in_the_past
    if expiration_date.present? && expiration_date < Date.today
      errors.add(:expiration_date, "can't be in the past")
    end
  end
 
  def discount_cannot_be_greater_than_total_value
    if discount > total_value
      errors.add(:discount, "can't be greater than total value")
    end
  end
end

默认情况下,  类似的校验在你每次调用valid?时, 将会运行. 同样也能控制, 当去运行这些个性化校验时, 通过给校验的方法后增加一个 :on 选项, 赋值 :create 或者 :update. 

class Invoice < ActiveRecord::Base
  validate :active_customer, on: :create
 
  def active_customer
    errors.add(:customer_id, "is not active") unless customer.active?
  end
end
 
0
1
分享到:
评论

相关推荐

    Python库 | cuenca_validations-0.9.17.dev6.tar.gz

    本文将深入探讨名为`cuenca_validations`的Python库,该库是版本0.9.17.dev6,通过其压缩包文件`cuenca_validations-0.9.17.dev6.tar.gz`进行分发。这个库主要服务于后端开发,特别针对与Cuenca API交互时的数据验证...

    Struts 2 数据校验功能及校验问题的解决方案

    Struts 2的数据校验还可以通过注解方式进行,使用@FieldCheck、@Validations等注解来指定字段的校验规则。这种方式更加直观,减少了代码量,但可能需要额外的库支持。 为了处理更复杂的数据校验场景,Struts 2支持...

    ember-i18n-cp-validations:ember-i18n支持ember-cp-validations

    ember-i18n-cp-validations 在ember-cp-validations中增加了对ember-i18n的支持 使用ember-intl? 请参阅: 安装 ember install ember-i18n-cp-validations 在ember-i18n-cp-validations中在2.x和3.x之间进行重大...

    jsp字段校验与非字段校验

    这种校验通常需要在服务器端执行,因为它涉及到多个输入的组合或复杂逻辑。在JSP中,可以通过编写Java后台代码或使用框架(如Struts2)提供的功能来实现。 **Struts2的验证框架** Struts2是一个强大的MVC框架,它...

    meteor-validations:流星变量验证的基础

    验证方式流星变量验证的基础安装meteor add zhaoyao91:validations 介绍该软件包定义了验证类,一个简单的架构,一些帮助根据架构构建验证树的函数以及一组内置验证。验证类别这是编写新的验证类的模板: /** * the ...

    Python库 | db_validations-0.1.1.tar.gz

    《Python数据库验证库db_validations详解》 在Python编程领域,数据库操作是后端开发中的重要环节,确保数据的有效性和一致性至关重要。db_validations库,正如其名,专注于提供数据库验证功能,帮助开发者构建更加...

    Python库 | validations-libs-1.0.4.tar.gz

    标题中的"Python库 | validations-libs-1.0.4.tar.gz"表明这是一个与Python相关的库,名为"validations-libs",版本号为1.0.4,且已打包成tar.gz格式的压缩文件。在Python编程中,库(Library)是预先编写好的代码...

    ember-validations:Ember-Validations - 用于处理对象验证的 Ember.js 库

    是一个很棒的类似库Ember-validations 是一个 Ember.js 库,可以处理对象验证。 如果您必须检查对象属性的有效性,这个库会为您完成。 您只需要声明要验证的属性,以及要对该属性进行哪种验证。 这个库的灵感来自于...

    Python库 | cuenca_validations-0.9.17.dev20.tar.gz

    《Python库cuenca_validations详解》 在Python的生态系统中,库扮演着至关重要的角色,它们提供了丰富的功能,使得开发者能够高效地构建各种应用程序。本文将深入探讨名为`cuenca_validations`的Python库,它在...

    Python库 | cuenca_validations-0.9.8.dev1.tar.gz

    《Python库cuenca_validations详解》 在Python的生态系统中,库扮演着至关重要的角色,它们提供了丰富的功能,使得开发者能够高效地构建各种应用程序。本文将深入探讨一个名为`cuenca_validations`的Python库,该库...

    PyPI 官网下载 | cuenca_validations-0.9.10.dev4.tar.gz

    《PyPI官网下载:cuenca_validations-0.9.10.dev4.tar.gz——深入解析Python库的构建与发布》 PyPI(Python Package Index),是Python开发者的重要资源库,它为全球的Python爱好者提供了无数开源软件包和模块,...

    Laravel开发-laravel-extended-validations

    Laravel的验证机制基于Validator类,它允许开发者通过简单的语法来定义和执行验证规则。默认的验证规则包括字符串长度、数字范围、电子邮件格式等。例如,我们可以使用`required`规则确保某个字段非空,`email`规则...

    cp-validations:ember-intl对ember-cp-validations的支持

    @ ember-intl / cp-validations 在ember-cp-validations中增加了对支持 使用ember-i18n? 请参阅: 要求 &gt; = 2.0.0-rc.5 ember-cp-validations &gt; = 2 安装 ember install @ember-intl/cp-validations 配置中 在...

    PyPI 官网下载 | tripleo_validations-8.4.2-py2-none-any.whl

    《PyPI官网下载:tripleo_validations-8.4.2-py2-none-any.whl》 在Python的世界里,PyPI(Python Package Index)是最重要的软件仓库,它为开发者提供了一个平台来发布和分享他们的Python软件包。标题中的"PyPI ...

    struts2 校验框架

    - 除了XML配置,Struts2还支持使用Java注解进行校验,比如`@RequiredFieldValidator`,`@Validations`等,使得代码更加简洁且易于维护。 4. **字段级和动作级验证**: - 字段级验证针对单个表单字段,而动作级...

    Laravel开发-laravel-validations

    // 验证通过后,此处代码将执行 } ``` 2. **自定义错误消息**:默认情况下,Laravel会提供一些预定义的错误消息,但你可以通过在验证规则中添加`:message`参数来自定义它们。例如: ```php 'name' =&gt; '...

    Python库 | cuenca_validations-0.6.7.dev4-py3-none-any.whl

    **Python库:cuenca_validations** `cuenca_validations`是一个专为Python开发者设计的库,主要用于处理与Cuenca API交互时的数据验证。Cuenca是一个金融技术平台,提供API接口来处理支付、转账等金融业务。`cuenca...

    dm-validations:用于对 DM 模型和纯 Ruby 对象执行验证的库

    当您在应用程序中需要 dm-validations' 时,DataMapper 验证功能可自动用于 DataMapper 资源。 无需手动包含任何内容,一旦需要此 gem,每个 DataMapper::Resource 都将能够处理验证。 指定模型验证 有两种主要...

    PyPI 官网下载 | cuenca_validations-0.7.7.dev1.tar.gz

    总的来说,“cuenca_validations”库为我们提供了一个深入了解Python包管理和发布的窗口,它包括了从打包、发布到安装和使用的整个流程,同时也展示了Python社区的标准化实践。通过深入研究和使用这个库,开发者不仅...

    PyPI 官网下载 | cuenca_validations-0.9.0.0rc0.tar.gz

    《PyPI官网下载:cuenca_validations-0.9.0.0rc0.tar.gz——探索Python库在分布式环境中的应用》 PyPI(Python Package Index)是Python社区广泛使用的软件包仓库,它提供了丰富的Python库供开发者下载和使用。在...

Global site tag (gtag.js) - Google Analytics