转: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;

}

相关推荐