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

Active Record Validations 1 Validations Overview 校验概述

阅读更多

version Rails 4.1

 
Active Record 校验
 
这份教程教你如何去校验对象的状态, 在他们进数据库之前, 使用 Active Record 的校验特征.
 
阅读完这份教程, 你将会知道:
  • 如何去使用内建的Active Record 校验helpers.
  • 如何去创建你自己定制化的校验方法.
  • 如何在校验的过程中去获取生成的错误信息.
 

1 Validations Overview 校验概述

这里是一个非常简单的校验例子:
class Person < ActiveRecord::Base
  validates :name, presence: true
end
 
Person.create(name: "John Doe").valid? # => true
Person.create(name: nil).valid? # => false

正如你所看到的, 我们的校验让我们知道, 我们的 Person 没有一个name的特性是无效的. 第二个 Person 将不会被保存到数据库中去.

 
在我们要挖掘更多的细节之前, 让我们来聊一聊, 如何把校验嵌入到你的应用程序这一张大图中.
 

1.1 Why Use Validations? 为什么要使用校验?

校验是被用来保证, 只有有效的数据才能被保存到你的数据库里. 举个例子来说, 它可能对你的应用程序很重要, 确保每一个用户提供的email 地址和发送地址都是有效的. 模型级别(Model-level)的校验是最好的方式来确保只有有效的数据能被保存到你的数据库里. 他们对于数据库是一无所知的, 不能够被终端用户忽视掉, 很方便的进行测试和维护. Rails 使得他们很方便地使用, 对于平常的需求提供了内建的helpers, 也允许你去创建你自己的校验方法.
 
有一些其他的方式来校验数据, 在它被保存进你的数据库里之前, 包括数据库自身的限制, 客户端的校验,  控制器级别(controller-level)的校验. 这里关于正反两方面的观点总结:
  • 数据库的限制条件 和/或者 存储过程使得校验机制与数据库无关,能够使得测试和维护变得更困难。然而, 如果你的数据库被其他的应用所使用, 那么在数据库级别使用一些限制会是一个好方法. 额外地, 数据库级别(database-level)校验能够安全地处理一些东西(类似于在高频率使用的数据表里采用唯一性), 不同地是这些实现起来有点困难.
  • 客户端的校验是很有用的, 但如果独自使用时通常不是很可靠. 如果他们是用 JavaScript 来实现的, 他们可能被忽略, 如果 JavaScript 被用户的浏览器禁止. 然而, 如果结合其他的技术, 客户端校验能够以很方便的方式给用户提供及时的反馈, 当他们使用你的站点时.
  • 控制器级别(Controller-level)的校验很容易使用, 但常常会使测试和维护变得笨重和困难. 只要有可能, 保持你的控制器精简是个好方法, 使得你的应用能够有一个良好的状态来长时间运行.
在某些特定的情况下选择这些. 这是 Rails 团队的意见, 在大多数情况下模型级别(model-level)的校验是最合适的.
 

1.2 When Does Validation Happen? 校验在什么时候发生呢?

有两种类型的 Active Record 对象: 有些是与你数据库中的行相对应的, 有些则不是. 当你创建一个新的对象时, 例如使用 new 方法, 这个时候对象还不属于数据库的.  一旦你紧接着调用 save, 那么它就会被保存到相应的数据表中了.  Active Record 使用 new_record? 实例方法来确定一个对象是否已经存在于数据库中了. 来看一下下文的这个简单的 Active Record 类的例子:
class Person < ActiveRecord::Base
end

我们可以看一下它是如何工作的, 通过 rails console 的输出内容:

$ bin/rails console
>> p = Person.new(name: "John Doe")
=> #<Person id: nil, name: "John Doe", created_at: nil, updated_at: nil>
>> p.new_record?
=> true
>> p.save
=> true
>> p.new_record?
=> false

创建和保存一个新的记录将会发送一个 INSERT 的SQL操作给数据库. 更新一个已存在的记录将会发送一个 UPDATE 的SQL操作. 校验通常是在这些命令被发送到数据库之前运行的. 如果任何的校验失败, 那么这个对象将会被标记为无效, 而Active Record 将不会去执行 INSERT 或者 UPDATE 操作. 这就会避免保存一个无效的对象到数据库里. 你可以选择用一个指定的校验来运行, 当一个对象被创建, 保存, 或者更新的时候.

 

warning: 有许多种方式来改变数据库中的对象状态. 一些方法会触发校验, 但有些就不会. 这也就意味着, 如果你不注意, 很有可能保存对象到数据里时是一个无效的状态.

 

下面的方法会触发校验, 只有当对象有效时才会把对象保存:

  • create
  • create!
  • save
  • save!
  • update
  • update!

有感叹号的版本(例如, save!)抛出一个异常, 当记录是无效的时候. 没有感叹号的版本则不会, save 和 update 返回 false, create 则会返回一个对象.

 

1.3 Skipping Validations 跳过的校验

下面的方法会跳过校验, 将会把对象保存进数据库里, 而不去管它的有效性. 他们使用的时候应该要注意.
  • decrement!
  • decrement_counter
  • increment!
  • increment_counter
  • toggle!
  • touch
  • update_all
  • update_attribute
  • update_column
  • update_columns
  • update_counters

注意, save 也能跳过校验, 如果传入的参数为 validate: false. 这个方法使用的时候也要注意.

  • save(validate: false)
 

1.4 valid? and invalid? 有效? 无效?

为了验证一个对象是否有效, Rails 使用 valid? 方法. 你也可以在你自己的 valid? 触发校验上使用这个方法, 如果没有错误产生, 那么返回 true, 否则就 false. 正如你在上面所看到的:
class Person < ActiveRecord::Base
  validates :name, presence: true
end
 
Person.create(name: "John Doe").valid? # => true
Person.create(name: nil).valid? # => false

在 Active Record 已经执行完校验之后, 任何的错误都能通过 errors.messages 实例方法中找到, 它会返回一连串的错误信息. 当然地, 如果运行完校验后这个错误集合是空的, 那么这一个对象是有效的.

 

注意, 对象是通过 new 来实例化的, 这不会产生错误信息, 即使它理论上是无效的, 因为在使用 new 时, 校验还没有开始执行.

class Person < ActiveRecord::Base
  validates :name, presence: true
end
 
>> p = Person.new
# => #<Person id: nil, name: nil>
>> p.errors.messages
# => {}
 
>> p.valid?
# => false
>> p.errors.messages
# => {name:["can't be blank"]}
 
>> p = Person.create
# => #<Person id: nil, name: nil>
>> p.errors.messages
# => {name:["can't be blank"]}
 
>> p.save
# => false
 
>> p.save!
# => ActiveRecord::RecordInvalid: Validation failed: Name can't be blank
 
>> Person.create!
# => ActiveRecord::RecordInvalid: Validation failed: Name can't be blank

invalid? 就是 valid? 的互逆. 它触发了你的校验, 当在对象中有任何错误信息时, 返回 true, 否则就返回 false.

 

1.5 errors[] 错误数组

为了验证一个对象中的一个特性是否有效, 你可以使用 errors[:attribute]. 它会返回一组这个 :attribute 的所有错误信息. 如果对于这个特性上没有错误信息, 那么返回的是一个空的数组.
 
这个只在校验已经运行的情况下有作用, 因为它只检查错误信息的集合, 而不会触发它自身的校验. 它是和 ActiveRecord::Base#invalid? 方法不一样的, 因为它不会去对于一个对象的整体性做校验. 它只会针对对象的各个特性检查是否有错误发生.
class Person < ActiveRecord::Base
  validates :name, presence: true
end
 
>> Person.new.errors[:name].any? # => false
>> Person.create.errors[:name].any? # => true

我们将会进一步地了解校验的错误信息在 Working with Validation Errors 部分. 至于现在, 让我们转到内建的校验 helpers, 这是 Rails 默认提供的.

 

 

0
0
分享到:
评论

相关推荐

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

    本文将深入探讨一个名为`cuenca_validations`的Python库,该库的最新版本为0.9.8.dev1。我们将从其核心功能、安装方法、使用示例以及与其他库的集成等方面进行详细解析。 `cuenca_validations`是一个专门用于处理...

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

    《PyPI官网下载:cuenca_validations-0.7.7.dev1.tar.gz——深入理解Python库的构建与发布》 在Python的世界里,PyPI(Python Package Index)是官方的软件仓库,它为开发者提供了发布和分享自己创建的Python库的...

    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之间进行重大...

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

    一、`cuenca_validations`概述 `cuenca_validations`是专门为Cuenca平台设计的一个验证库,该平台可能涉及到支付、转账、账单管理等金融业务。此库提供了许多预定义的验证规则,帮助开发者快速检查并确认输入数据...

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

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

    jsp字段校验与非字段校验

    **JSP字段校验与非字段校验** 在Web开发中,数据验证是必不可少的一环,它可以确保用户输入的数据符合应用程序的要求,防止错误的数据进入系统。JSP(JavaServer Pages)作为Java EE平台上的动态网页技术,提供了...

    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)是预先编写好的代码...

    Python库 | db_validations-0.1.1.tar.gz

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

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

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

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

    《Python库cuenca_validations详解》 在Python的开发世界中,库是开发者们的重要工具,它们提供了丰富的功能,让编程工作变得更加高效。本文将深入探讨名为`cuenca_validations`的Python库,该库是版本0.9.17.dev6...

    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 官网下载 | cuenca_validations-0.9.10.dev4.tar.gz

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

    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 ...

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

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

    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库供开发者下载和使用。在...

    Laravel开发-laravel-extended-validations

    1. **日期范围验证**:允许开发者设定一个日期字段必须在特定的日期范围内,例如`date_between:startDate,endDate`。 2. **文件类型验证**:除了默认的`mimes`规则,可能还提供了更灵活的文件类型验证,如检查文件...

    Laravel开发-laravel-validations

    本教程将深入探讨`laravel-validations`,这是Laravel中的验证机制,它提供了一种优雅的方式来处理输入数据的验证。 **一、验证基础** 1. **验证控制器方法**:在控制器中,我们通常会在处理用户请求的方法内进行...

    struts2 校验框架

    1. **XML配置校验**: - Struts2允许通过XML配置文件定义校验规则,这些规则与Action类关联。在`struts.xml`中,你可以使用`&lt;validate&gt;`标签来指定一个Action对应的校验文件。 2. **校验文件**: - 校验规则通常...

    Android代码-Android-EditText-Validations

    Android EditText Validations Easily Validate EditTexts This library is best used with Kotlin, and is to help reduce boilerplate code when writing validation rules for EditText fields. To install: ...

Global site tag (gtag.js) - Google Analytics