跳转到内容

Ruby on Rails/ActiveRecord/Validations

来自 Wikibooks,开放世界中的开放书籍

ActiveRecord 支持各种模型验证方法,并允许根据需要添加新方法。

一般用法

[编辑 | 编辑源代码]

有关所有验证的完整参考,请查看官方指南API 文档

此外,您可以使用以下方法将验证应用于一个或多个属性:validate_each指令

  class Person < ActiveRecord::Base
    validates_each :first_name, :last_name do |record, attr, value|
      record.errors.add attr, 'starts with z.' if value[0] == ?z
    end
  end

也可以通过自定义方法或块定义验证

  • validate
  • validate_on_create
  • validate_on_update

例如

    class Person < ActiveRecord::Base
      validate :validate_email

      def validate_email
        record.errors.add :email, 'Invalid email' unless email =~ /@/
      end
    end

通常,验证发生在每次创建或保存记录时,但是您可以使用以下方法强制验证*不*发生:save_with_validation方法传递@false@作为参数。

重要验证器

[编辑 | 编辑源代码]

validates_acceptance_of

[编辑 | 编辑源代码]
validates_acceptance_of :play_rules

如果您需要检查用户是否设置或“接受”了某个复选框,可以使用此验证。在这种情况下,具有 HTML 属性“name='play_rules'”的复选框需要被选中才能通过验证。

validates_confirmation_of

[编辑 | 编辑源代码]

此验证器检查输入字段是否两次都输入正确。例如,如果您希望用户两次输入他的密码以确保他输入了正确的密码(这在网站注册时经常看到),那么这就是您要使用的助手。要使用它,请确保在您的视图中正确定义它(注意_confirmation

<%= text_field :user, :password%>
<%= text_field :user, :password_confirmation %>

validates_format_of

[编辑 | 编辑源代码]

validates_format_of接受一个正则表达式,并检查输入是否与 :with 子句提供的模式匹配。还要注意,我们在这里使用了一个自定义消息。这可以在每个验证器中以相同的方式完成。

validates_format_of :username, :with => /\A[a-zA-Z]+\z/,  :message => "Please use only regular letters as username"

validates_length_of/validates_size_of

[编辑 | 编辑源代码]
validates_length_of :username, :minimum => 5, :maximum => 50
validates_size_of :address, :in => 5..100

length_of/size_of验证器在您需要检查输入的字符长度是否满足特定要求时很有用。在上面的示例中,用户名长度不能超过 50 个字符,也不能少于 5 个字符。或者,您可以指定一个范围,该范围应该为真才能验证。上面,地址应该包含 5 到 100 个字符。请注意length_ofsize_of/是相同的。

validates_numericality_of

[编辑 | 编辑源代码]
validates_numericality_of :amount_available

检查输入是否为任何类型的数字。为了确保输入只是整数,您可以使用可选的:only_integer => true命令。此命令有一些有用的选项,例如:greater_than => 100确保给定的数字大于 100:因此 101 将是第一个有效数字。

validates_presence_of

[编辑 | 编辑源代码]
validates_presence_of :name

最基本的验证器之一,它检查给定的表单元素(在本例中为“name”)中是否输入了任何内容。

validates_uniqueness_of

[编辑 | 编辑源代码]
validates_uniqueness_of :username

最后,一个比较高级的验证器:它检查数据库中是否存在指定的属性值。在这种情况下,如果用户选择用户名“Paul”,而“Paul”已经存在于数据库的用户名列中,则它将不会通过验证。

使用范围

[编辑 | 编辑源代码]

它还可以验证指定属性的值是否基于多个范围参数是唯一的。例如,确保老师在某个学期只能在某个特定课程的课程表中出现一次。

validates_uniqueness_of :teacher_id, :scope => [:semester_id, :class_id]

创建记录时,会执行检查以确保数据库中不存在具有指定属性(映射到列)的给定值的记录。更新记录时,会进行相同的检查,但会忽略记录本身。

配置选项

[编辑 | 编辑源代码]
  • message - 指定自定义错误消息(默认值为:“已被使用”)
  • scope - 一个或多个用于限制唯一约束范围的列。
  • if - 指定要调用的方法、proc 或字符串以确定是否应进行验证(例如 :if => :allow_validation,或 :if => Proc.new { |user| user.signup_step > 2 })。方法、proc 或字符串应该返回或计算为真值或假值。

编写验证时,请记住您可以将所有这些选项混合使用,并且还有更多高级功能,您可能想查看一下。

华夏公益教科书