`
jbf034
  • 浏览: 152424 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Validation (转)

阅读更多
15.4 Validation

1、validates_acceptance_of 确认checkbox是否被标记
2、validates_associated 在关联的对象上完成确认。
3、validates_confirmation_of 确认字段和它的值有同样内容
4、validates_each 使用一个块来确认一或多个属性
5、validates_exclusion_of 确认属性不在一组值中。
6、validates_format_of 在一个模式上确认属性。
7、validates_inclusion_of 确认属性是否属于一个值集。
8、validates_length_of 确认属性值的长度。
9、validates_numericality_of 确认那个属性是有效的数字
10、validates_presence_of 确认属性不为空。
11、validates_uniqueness_of 确认属性是唯一的。

“活动记录”可以确认一个“模型”对象的内容。这个确认在一个对象被保存时可以自动地完成。你也可以编程请求一个“模型”的当前状态的确认。

就像我们在上一章提到的,“活动记录”能够区别出数据库内与现有行相应的“模型”还是没有现有行与之对应的“模型”。后者被称为新记录(new_record?()方法将为它们返回true)。当你调用save()方法时,“活动记录”将为新记录完成一个SQL 插入操作并对现有的那个进行更新。

这种区别是“活动记录”的确认工作流的反射—你可以指定在所有保存操作上完成的确认,以及只用于创建或更新上完成的确认。

在低层你通过实现validate( ), validate_on_create( ), 和 validate_on_update( )这些方法的一个或多个来指定确认。validate()方法在每个保存操作中被调用。后两个则依赖于记录是否是新的,或者它先前是否从数据库中读取过来调用。

除了调用valid?()保存“模型”对象到数据外,你也可以在任何时候运行确认。这个调用与调用save()来保存的两个确认方法是一样的。
class User < ActiveRecord::Base
def validate
unless name && name =~ /^w+$/
errors.add(:name, "is missing or invalid")
end
end
def validate_on_create
if self.find_by_name(name)
errors.add(:name, "is already being used")
end
end
end
当一个确认方法发现问题时,它使用errors.add()方法添加一个信息给这个“模型”对象的错误列表。第一个参数是出错属性的名字,第二个参数是错误消息。如果你需要添加一个用于整个“模型”对象的错误消息,使用add_to_base()方法代替。(注意,这个代码使用了支持方法blank?(),它在它的被调为nil或是个空字符串时返回true。)
def validate
if name.blank? && email.blank?
errors.add_to_base("You must specify a name or an email address")
end
end
像我们353页看到的,Rails“视图”在显示表单给最终用户时可以使用错误列表—有错误的字段将被自动高亮度地显示,并且用错误列表添加一个漂亮的方框在顶部。
你可以编程为一个特定属性使用errors.on(:name)(别名为errors[:name])来获得错误,并且你可以用errors.clear()清除整个错误列表。如果你查阅ActiveRecord::Errors文档,你会发现有很多其它方法。大多数方法可由高级的确认帮助方法来代替。
Validation Helpers
有些确认是平常:这个属性必须不能为空,其它属性必须在18和65之间等等。“活动记录”有一套标准的帮助方法来添加这些确认给你的“模型”。每个都是类级别方法,所有名字都以validates_开头。每个方法接受可选的属性名字列表,它是由配置选项的哈希表提供给确认的。

例如,我们可以这样写先前确认
class User < ActiveRecord::Base
validates_format_of :name,
:with => /^w+$/,
:message => "is missing or invalid"
validates_uniqueness_of :name,
:on => :create,
:message => "is already being used"
end
大多数validates_methods接受:on和:message选项。:on选项确定何时应用确认并接受:save(缺省的),:create,或:update中的一个。:message参数可以用生成错误消息覆写它。
确认失败时,帮助方法添加一个error对象给“活动记录”“模型”对象。这将被关联到被确认的字段。在确认之后,你可以查看“模型”对象的errors属性来访问错误列表。当“活动记录”被用做Rails应用程序一部分时,这个检查通常由两个步骤完成:
1、“控制器”试图保存一个“活动记录”对象,但因为确认的原因保存失败了 (返回false)。 “控制器”将重新显示包含错误数据的表单。
2、“视图模板”使用error_messages_for()方法来显示“模型”对象的错误列表,并且用户有机会来修正字段。
我们在17.8节讨论表单与“模型”的交互。
这儿是你可以用在“模型”对象内的确认帮助方法的清单:

1、validates_acceptance_of 确认checkbox是否被标记。
validates_acceptance_of attr... [ options... ]
许多表单有checkbox,用户必须选择以便接受一些条款或条件。这个确认简单地检验这个box已经确认被标记,这个属性值是个字符串。属性本身并不被保存在数据库内(如果你希望明确地记录确认的话,没有什么东西会阻止你这样做)。
class Order < ActiveRecord::Base
validates_acceptance_of :terms,
:message => "Please accept the terms to proceed"
end
选项:
:message text,缺省是“must be accepted.”。
:on :save,:create 或者:update

2、validates_associated 在关联的对象上完成确认。
validates_associated name... [ options... ]
在给定的属性上完成确认,它被假设为是“活动记录模型”。对每个与属性关联的确认失败的话,一个单独的消息将被添加到那个属性的错误列表中(也就是说,个别的细节原因而出现的失败,将不会写到“模型”的错误列表中)。
小心不要包含一个validates_associated()调用在彼此引用的“模型”中:第一个将会试图确认第二个,它依次将确认第一个等等,直接你堆栈溢出。
class Order < ActiveRecord::Base
has_many :line_items
belongs_to :user
validates_associated :line_items,
:message => "are messed up"
validates_associated :user
end
选项:
:message text ,缺省是 “is invalid.”
:on :save,:create 或者:update

3、validates_confirmation_of 确认字段和它的值有同样内容。
validates_confirmation_of attr... [ options... ]

很多表单要求用户输入同一信息两次,第二次拷贝“动作”被做为与第一次是否匹配的确认。如果你使用命名约定,即第二字段的名字附有_confirmation,你可以使用validates_confirmation_of()来检查两个字段是否有同样的值。第二个字段不需要被存储到数据库中。
例如,一个“视图”可能包含
<%= password_field  "user", "password" %><br />
<%= password_field  "user", "password_confirmation" %><br />
在User“模型”中,你可以用一个确认来检验两个口令。
class User < ActiveRecord::Base
validates_confirmation_of :password
end
选项:
:message text 缺省是“doesn’t match confirmation.”
:on :save, :create, 或 :update

4、validates_each 使用一个块来确认一或多个属性。
validates_each attr... [ options... ] { |model, attr, value| ... }
为每个属性调用块(如果:allow_nil为true,则跳过是nil的属性)。传递属性的名字,属性的值到被确认的“模型”内。如下面例子显示的,如果一个确认失败,块应该被添加给“模型”的错误列表
class User < ActiveRecord::Base
validates_each :name, :email do |model, attr, value|
if value =~ /groucho|harpo|chico/i
model.errors.add(attr, "You can't be serious, #{value}")
end
end
end
选项:
:allow_nil boolean 如果 :allow_nil 为 true,带有值nil的属性将不被传递给块而是被跳过。
:on :save, :create, 或 :update

5、validates_exclusion_of 确认属性不在一组值中。
validates_exclusion_of attr..., :in => enum [ options... ]
确认属性没有出现在枚举中(任何对象都支持include?()断言)。
class User < ActiveRecord::Base
validates_exclusion_of :genre,
:in => %w{ polka twostep foxtrot },
:message => "no wild music allowed"
validates_exclusion_of :age,
:in => 13..19,
:message => "cannot be a teenager"
end
选项:
:allow_nil 如果属性为nil,并且:allow_nil选项为true。则枚举不被检查。
:in (或 :within) enumerable 一个可枚举对象。
:message text 缺省值是 “is not included in the list.”
:on :save, :create, 或 :update

6、validates_format_of 在一个模式上确认属性。
validates_format_of attr..., :with => regexp [ options... ]
通过与正则表达式匹配它的值来确认每个字段。

class User < ActiveRecord::Base
validates_format_of :length, :with => /^d+(in|cm)/
end
选项:
:message text 缺省值 “is invalid.”
:on :save, :create, or :update
:with 用于确认属性的正则表达式。

7、validates_inclusion_of 确认属性是否属于一个值集。
validates_inclusion_of attr..., :in => enum [ options... ]
确认每个属性的值是否出现在枚举中(任何对象都支持include?()断言)。
class User < ActiveRecord::Base
validates_inclusion_of :gender,
:in => %w{ male female },
:message => "should be 'male' or 'female'"
validates_inclusion_of :age,
:in => 0..130,
:message => "should be between 0 and 130"
end
选项:
:allow_nil 如果属性为nul并且:allow_nil选项为true,则不检查枚举值。
:in (或 :within) enumerable 一个可枚举的对象。
:message text 缺省值是 “is not included in the list.”
:on :save, :create, 或 :update

8、validates_length_of 确认属性值的长度。
validates_length_of attr..., [ options... ]
遵循一些约束确认每个属性的值的长度:至少要给出一个长度,至多给出一个长度,在两个长度之间,或者明确地给出一个长度。而不能只有单个:message选项,这个确认器允许为不同的确认失败分离消息,只要:message还可以使用。在所有选项中,长度不能负数。
class User < ActiveRecord::Base
validates_length_of :name, :maximum => 50
validates_length_of :password, :in => 6..20
validates_length_of :address, :minimum => 10,
:message => "seems too short"
end
选项(用于validates_length_of):
:in (或 :within) range 值的长度必须在一个范围内。
:is integer 值必须是整数的字符长度。
:minimum integer 值不能小于此整数。
:maximum integer 值不能大于此整数。
:message text 依赖于完成测试的缺省信息。消息可以包含一个将被maximun,minimum,或确定长度代替的%d序列。
:on :save, :create, 或 :update
:too_long text 使用:maximum时的:message同义词。
:too_short text使用:minimum时的:message同义词。
:wrong_length text使用:is 时的:message同义词。

9、validates_numericality_of 确认那个属性是有效的数字。
validates_numericality_of attr... [ options... ]
确认每个属性是个有效数字。在:only_integer选项中,属性必须由可选的符号后跟随一个或多个数字。在选项中(或者如果选项不是true),可由Ruby Float()方法允许的任何浮点数都被接受。
class User < ActiveRecord::Base
validates_numericality_of :height_in_meters
validates_numericality_of :age,nly_integer => true
end
选项:
:message text 缺省是 “is not a number.”
:on :save, :create, 或 :update
:only_integer 如果为 true,则属性必须是包含一个可选的符号后跟随数字的字符串。
10、validates_presence_of 确认属性不为空。
validates_presence_of attr... [ options... ]
确认每个属性即不为nil也不为空。
class User < ActiveRecord::Base
validates_presence_of :name, :address
end
选项:
:message text 缺省是 “can’t be empty.”
:on :save, :create, 或 :update

11、validates_uniqueness_of 确认属性是唯一的。
validates_uniqueness_of attr... [ options... ]
对于每个属性,确认数据库内的其它行当前没有与给定列同样的值。当“模型”对象来自于一个现有数据库的行时,当完成检查时那个行被忽略。选项:scope参数可以被用于过滤当前记录内:scope列内被测试的,有同样值的行。
这个代码确保用户名字在数据库中唯一的。
class User < ActiveRecord::Base
validates_uniqueness_of :name
end
这个代码确保用户的名字在一个组内唯一的。
class User < ActiveRecord::Base
validates_uniqueness_of :name, :scope => "group_id"
end
选项:
:message text 缺省是 “has already been taken.”
:on :save, :create, 或 :update
:scope attr Limits the check to rows having the same value in the column as the row being checked.
分享到:
评论

相关推荐

    Bean Validation 规范文档

    《Bean Validation规范详解》 Bean Validation是Java平台上用于对象验证的一种标准,旨在提供一种简单而强大的方式来确保Java Bean对象的正确性和完整性。本规范文档深入解析了Bean Validation的各个方面,包括其...

    easyexcel+validation excel导入导出下载

    EasyExcel是一款由阿里巴巴开发的轻量级Java库,专门用于处理Excel数据的读写操作,而Validation则是用于数据验证的一种机制。本文将深入探讨如何结合EasyExcel和Validation实现高效且准确的Excel导入导出与数据校验...

    formvalidation.io, FormValidation官方网站.zip

    formvalidation.io, FormValidation官方网站 formvalidation.io这个存储库包含了 formvalidation.io的源代码。安装$ gem install jekyll$ gem install bundler转到 root 目录并安

    springmvc校验器validation的所有配套jar包

    Hibernate Validation是Java Bean Validation规范的一个实现,这个规范定义了一种标准的方式来声明和执行对象级别的约束。它提供了一种声明式的验证方式,使得在代码中对数据进行验证变得更加简洁。以下是关于...

    基于模型开发的MATLAB simulink validation and verification(V&V)

    "基于模型开发的MATLAB Simulink Validation and Verification(V&V)"这个主题,着重探讨的是在Simulink环境中如何有效地进行模型的验证和确认,以确保设计的准确性和合规性。 验证(Validation)是确认模型是否...

    jquery ui validation canlender美工实例

    《jQuery UI Validation与Calendar美工实例详解》 在Web开发中,用户界面的美观与交互性至关重要,jQuery UI提供了一套强大的工具集,包括验证(Validation)和日历(Calendar)组件,使得开发者能够轻松创建出高效...

    Design amd Validation of Computer Protocols

    ### 设计与验证计算机协议的关键知识点 #### 一、引言 《设计与验证计算机协议》这本书由Gerard J. Holzmann撰写,是Prentice-Hall Software Series系列之一,Brian W....该书系统地介绍了计算机网络协议的设计与验证...

    Strut2 + il8n + validation 源码完整版

    在这个"Strut2 + il8n + validation 源码完整版"项目中,我们看到开发者已经整合了Struts2框架与国际化(i18n)和验证功能,这些是开发高效且用户友好的Web应用的关键组件。 **Struts2框架:** Struts2的核心是Action...

    struts验证框架-validation的验证框架

    - **Validation**:标记一个类需要被校验,通常配合Struts的配置文件使用。 ### 验证器类型详解 1. **ConversionErrorFieldValidator**:用于检测字段转换时是否出现错误,例如将字符串转换为日期时的异常情况。 2...

    Laravel开发-base64-validation

    `Laravel开发-base64-validation` 涉及的主题是关于如何在Laravel中实现对base64编码的文件进行验证。 在Laravel中,验证是通过Validator类来完成的,它提供了丰富的规则来确保输入数据的正确性。对于base64编码的...

    jquery-validation-1.19.1

    《jQuery Validation插件详解及其1.19.1版本特性》 jQuery Validation插件是Web开发中用于表单验证的一款强大工具,它以其简洁的API和丰富的自定义能力深受开发者喜爱。本文将深入探讨jQuery Validation插件的核心...

    validation-api-1.1.0.Beta2.zip

    goose.zip,goose最初是一个用java编写的文章提取器,最近(2011年8月)已经转换为scala项目。它的任务是获取任何新闻文章或文章类型的网页,不仅提取文章的主体,而且还提取所有元数据和最可能的图像候选。...

    物业交易

    提取-file_validation 转换-file_key_generation,append_prop_key 加载-create_JSON,get_nested_rec 在GCP中,使用Apache Beam在Dataflow中创建无服务器数据转换管道。 Apache Beam能够进行批处理和流处理,...

    The GNSS integer ambiguities_ estimation and validation

    标题与描述均提及了“GNSS整数模糊度:估计与验证”,这表明文档主要讨论的是全球导航卫星系统(GNSS)中一个关键的技术问题——整数模糊度的估计与验证方法。GNSS,包括GPS、GLONASS、Galileo和BeiDou等,是现代...

    v-validation:V代表验证

    动量Vmoment包含v-validation的扩展 。小路@finnair/path包含部分与JsonPath兼容的路径实用程序: Path -用于定位,读取或写入对象的具体JSON路径。 PathMatcher类似JsonPath的查询处理器。 Projection -基于...

    SpringMVC之DataBinding和Validation--Validator,PropertyEditor,Converter,Formatter

    总的来说,Spring MVC的Data Binding和Validation是处理用户输入的强大工具,`Validator`提供了自定义验证逻辑的途径,而`PropertyEditor`、`Converter`和`Formatter`则帮助我们处理类型转换问题。了解并熟练运用...

    .NET验证组件Fluent Validation使用指南

    .NET验证组件Fluent Validation使用指南详细知识点: 1. Fluent Validation介绍: Fluent Validation是一个轻量级的.NET类库,专为.NET平台设计,用于构建业务对象的验证规则。它使用流畅的接口定义和lambda表达式...

    mongoose-validation-error-transform:将Mongoose验证错误消息自动转换为人性化且可读的格式

    npm install --save mongoose-validation-error-transform 您可能还希望使用 (请参阅)! 用法 const mongooseValidationErrorTransform = require ( 'mongoose-validation-error-transform' ) ; mongoose . ...

    validation.m:数据验证-matlab开发

    `validation.m` 文件很可能是用来执行这个任务的一个脚本或函数,用于对数据进行一系列的检查、比较和评估。在MATLAB中进行数据验证通常包括以下几个关键步骤: 1. **数据预处理**:首先,数据往往需要清洗和预处理...

Global site tag (gtag.js) - Google Analytics