Ruby on Rails/ActiveRecord/Validations
ActiveRecord 支持各种模型验证方法,并允许根据需要添加新方法。
此外,您可以使用以下方法将验证应用于一个或多个属性: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 :play_rules
如果您需要检查用户是否设置或“接受”了某个复选框,可以使用此验证。在这种情况下,具有 HTML 属性“name='play_rules'”的复选框需要被选中才能通过验证。
此验证器检查输入字段是否两次都输入正确。例如,如果您希望用户两次输入他的密码以确保他输入了正确的密码(这在网站注册时经常看到),那么这就是您要使用的助手。要使用它,请确保在您的视图中正确定义它(注意_confirmation)
<%= text_field :user, :password%>
<%= text_field :user, :password_confirmation %>
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 :username, :minimum => 5, :maximum => 50
validates_size_of :address, :in => 5..100
该length_of/size_of验证器在您需要检查输入的字符长度是否满足特定要求时很有用。在上面的示例中,用户名长度不能超过 50 个字符,也不能少于 5 个字符。或者,您可以指定一个范围,该范围应该为真才能验证。上面,地址应该包含 5 到 100 个字符。请注意length_of和size_of/是相同的。
validates_numericality_of :amount_available
检查输入是否为任何类型的数字。为了确保输入只是整数,您可以使用可选的:only_integer => true命令。此命令有一些有用的选项,例如:greater_than => 100确保给定的数字大于 100:因此 101 将是第一个有效数字。
validates_presence_of :name
最基本的验证器之一,它检查给定的表单元素(在本例中为“name”)中是否输入了任何内容。
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 或字符串应该返回或计算为真值或假值。
编写验证时,请记住您可以将所有这些选项混合使用,并且还有更多高级功能,您可能想查看一下。