转:Rails Model验证及自定义验证
自定义验证:
可以自定义validate(),这个方法在每次保存数据时都会被调用.
如:
代码
defvalidate
ifname.blank?&&email.blank?
errors.add_to_base("Youmustspecifyanameoranemailaddress")
end
end
同时也可以自定义validate_on_create(),validate_on_update()方法.
valid?()方法可以随时调用,用来测试数据是否能通过校验
返回的错误信息可用error_messages_for(model)方法显示.
如:<%=error_messages_for'article'%>
=============================================================================
validates_presence_of:login,:message=>"用户名不能为空!"
validates_length_of:login,:minimum=>4,:message=>"用户名长度须为4到20位字母或数字!"validates_uniqueness_of:login,:case_sensitive=>false,:message=>"该用户名已存在!"
validates_presence_of:password,:message=>"密码不能为空!"
validates_length_of:password,:minimum=>6,:message=>"密码长度须为6到20位字母或数字!"
validates_presence_of:password_confirmation,:message=>"请再输入一次密码!"
validates_confirmation_of:password,:message=>"两次密码不一致!"
validates_format_of:email,:message=>"邮箱格式不正确!",:with=>/\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i
这里用到了5个主要的验证语法,下面分别介绍:
1、validates_presence_of——确认属性值不为nil也不为空。
用法:validates_length_ofattr...,[选项...]
选项:
:message=>缺省是"iscan'tbeblank."
:on=>:save,:create,或:update
2、validates_length_of——确认属性值的长度。遵循一些约束:至少要给出一个长度(如最小长度:minimum,最大长度:maximum,或一个区间:inor:within,但是这三者只能选其一,长度不能负数),而不能只有单个:message选项,这个确认器允许为不同的确认失败分离消息,只要:message还可以使用。
用法:validates_length_ofattr...,[选项...]
例子:
validates_length_of:name,:maximum=>50#这个时候可以自定义:message
validates_length_of:password,:in=>6..20#这个时候采用默认的:message,忽略自定义内容
validates_length_of:address,:minimum=>10,:message=>"seemstooshort"
选项:
:in(或:within)=>值的长度必须在一个范围内。
: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同义词。
3、validates_uniqueness_of——确认属性是唯一的。对于每个属性,确认数据库内的其它行当前没有与给定列同样的值。
用法:validates_uniqueness_ofattr...[选项...]
选项:
:message=>缺省是"hasalreadybeentaken."
:on=>:save,:create,或:update
:scope=>attrLimitsthechecktorowshavingthesamevalueinthecolumnastherowbeingchecked.
4、validates_confirmation_of——确认字段和它的值有同样内容。很多表单要求用户输入同一信息两次(如确认密码)如果你使用命名约定,即第二字段的名字附有_confirmation,你可以使用validates_confirmation_of()来检查两个字段是否有同样的值。
用法:validates_confirmation_ofattr...[选项...]
选项:
:message=>缺省是"doesn'tmatchconfirmation."
:on=>:save,:create,或:update
5、validates_format_of——在一个模式上确认属性。通过与正则表达式匹配它的值来确认每个字段。
用法:validates_format_ofattr...,:with=>regexp[选项...]
选项:
:message=>缺省是"isinvalid."
:on=>:save,:create,或:update
此外还有一些验证如下:
6、validates_acceptance_of——确认checkbox是否被标记。许多表单有checkbox,用户必须选择以便接受一些条款或条件。这个确认简单地检验这个box已经确认被标记,这个属性值是个字符串。属性本身并不被保存在数据库内(如果你希望明确地记录确认的话,没有什么东西会阻止你这样做)。
用法:validates_acceptance_ofattr...[选项...]
例子:
validates_acceptance_of:terms,:message=>"Pleaseacceptthetermstoproceed"
选项:
:message=>缺省是"mustbeaccepted."
:on=>:save,:create,或:update
7、validates_associated——在关联的对象上完成确认。在给定的属性上完成确认,它被假设为是"活动记录模型"。对每个与属性关联的确认失败的话,一个单独的消息将被添加到那个属性的错误列表中(也就是说,个别的细节原因而出现的失败,将不会写到"模型"的错误列表中)。小心不要包含一个validates_associated()调用在彼此引用的"模型"中:第一个将会试图确认第二个,它依次将确认第一个等等,直接你堆栈溢出。
用法:validates_associatedname...[选项...]
例子:
classOrder<ActiveRecord::Base
has_many:line_items
belongs_to:user
validates_associated:line_items,:message=>"aremessedup"
validates_associated:user
end
选项:
:message=>缺省是"isinvalid."
:on=>:save,:create,或:update
8、validates_each——使用一个块来确认一或多个属性。为每个属性调用块(如果:allow_nil为true,则跳过是nil的属性)。传递属性的名字,属性的值到被确认的"模型"内。如下面例子显示的,如果一个确认失败,块应该被添加给"模型"的错误列表
用法:validates_eachattr...[选项...]{|model,attr,value|...}
例子:
classUser<ActiveRecord::Base
validates_each:name,:emaildo|model,attr,value|
ifvalue=~/groucho|harpo|chico/i
model.errors.add(attr,"Youcan'tbeserious,#{value}")
end
end
end
选项:
:allow_nil=>boolean值,如果:allow_nil为true,带有值nil的属性将不被传递给块而是被跳过。
:on=>:save,:create,或:update
9、validates_exclusion_of——确认属性不在一组值中。确认属性没有出现在枚举中(任何对象都支持include?()断言)。
用法:validates_exclusion_ofattr...,:in=>enum[选项...]
例子:
classUser<ActiveRecord::Base
validates_exclusion_of:genre,:in=>%w{polkatwostepfoxtrot},
:message=>"nowildmusicallowed"
validates_exclusion_of:age,:in=>13..19,:message=>"cannotbeateenager"
end
选项:
:allow_nil=>如果属性为nil,并且:allow_nil选项为true。则枚举不被检查。
:in(或:within)=>一个可枚举对象。
:message=>缺省是"isinvalid."
:on=>:save,:create,或:update
10、validates_inclusion_of——确认属性是否属于一个值集。确认每个属性的值是否出现在枚举中(任何对象都支持include?()断言)。
用法:validates_inclusion_ofattr...,:in=>enum[选项...]
例子:
classUser<ActiveRecord::Base
validates_inclusion_of:gender,:in=>%w{malefemale},
:message=>"shouldbe'male'or'female'"
validates_inclusion_of:age,:in=>0..130,:message=>"shouldbebetween0and130"
end
选项:
:allow_nil=>如果属性为nil,并且:allow_nil选项为true。则枚举不被检查。
:in(或:within)=>一个可枚举对象。
:message=>缺省是"isnotincludedinthelist."
:on=>:save,:create,或:update
11、validates_numericality_of——确认那个属性是有效的数字。确认每个属性是个有效数字。在:only_integer选项中,属性必须由可选的符号后跟随一个或多个数字。在选项中(或者如果选项不是true),可由RubyFloat()方法允许的任何浮点数都被接受。
用法:validates_numericality_ofattr...[选项...]
例子:
classUser<ActiveRecord::Base
validates_numericality_of:height_in_meters
validates_numericality_of:age,nly_integer=>true
end
选项:
:message=>缺省是"isnotanumber."
:on=>:save,:create,或:update
:only_integer=>如果为true,则属性必须是包含一个可选的符号后跟随数字的字符串。
.\public\stylesheets\scaffold.css(默认css样式)
body{background-color:#fff;color:#333;}
body,p,ol,ul,td{
font-family:verdana,arial,helvetica,sans-serif;
font-size:13px;
line-height:18px;
}
pre{
background-color:#eee;
padding:10px;
font-size:11px;
}
a{color:#000;}
a:visited{color:#666;}
a:hover{color:#fff;background-color:#000;}
.fieldWithErrors{
padding:2px;
background-color:red;
display:table;
}
下面是错误信息的样式:
#errorExplanation{
width:400px;
border:2pxsolidred;
padding:7px;
padding-bottom:12px;
margin-bottom:20px;
background-color:#f0f0f0;
}
#errorExplanationh2{
text-align:left;
font-weight:bold;
padding:5px5px5px15px;
font-size:12px;
margin:-7px;
background-color:#c00;
color:#fff;
}
#errorExplanationp{
color:#333;
margin-bottom:0;
padding:5px;
}
#errorExplanationulli{
font-size:12px;
list-style:square;
}