rails 常用的验证方法 validates (转)
Agile Web Development with Rails
17.4 validation
validate 在save的时候激活
validate_on_create create
validate_on_update update
通过这三个方法可以添加
validates_XXX_xxx没有的功能
错误信息写进err
#:name 是验证的属性名
def validate
unless name && name =~ /^\w+$/
errors.add(:name, "is missing or invalid" )
end
end
validates_方法有两个选项
:on 指明激活的时间 save,update,create
:message 出错时显示的消息
validate_acceptiance_of 验证复选框是否勾选
validates_acceptance_of :terms,
:message => "Please accept the terms to proceed"
validate_associated 数据库关联
class Order < ActiveRecord::Base
has_many :line_items
belongs_to :user
validates_associated :line_items,
:message => "are messed up"
validates_associated :user
end
validates_confirmation_of 验证变量值是否一直
在使用的时候要注意变量名,用于验证的变量名要为 XXX_confirmation
如要验证 password,相对的变量应为 password_confirmation
validates_each attr... [ options... ] { |model, attr, value| ... } 用block验证
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
validates_exclusion_of attr..., :in => enum [ options... ]
验证排除在外的值,使用枚举
validates_exclusion_of :age,
:in => 13..19,
:message => "cannot be a teenager"
validates_inclusion_of attr..., :in => enum [ options... ]
验证在内的值
validates_inclusion_of :gender,
:in => %w{ male female },
:message => "should be 'male' or 'female'"
validates_format_of attr..., :with => regexp [ options... ]
验证格式,使用正则表达式
validates_length_of
验证长度
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_numericality_of 验证是否是数值
:only_integer 是否是整数
validates_presence_of 验证是否为空
validates_uniqueness_of 验证是否唯一
和数据库中已有的记录比较。 scope选项限制范围
class User < ActiveRecord::Base
validates_uniqueness_of :name, :scope => "group_id"
end
---------------------------------------------------
17.5 回调
使用回调机制,可以让我们的代码参与进程监控
class User < ActiveRecord::Base
before_destroy :dont_destroy_dave
def dont_destroy_dave
raise "Can't destroy dave" if name == 'dave'
end
end
回调的点有很多
如 before_validation
after_validation
before_save
after_save
after_create
after_save
...
见332页,一共有20个回调点
使用回调有两种方式
1是定义和回调点一样名字的方法
class Order < ActiveRecord::Base
# ..
def before_save
self.payment_due ||= Time.now + 30.days
end
end
2.是定义句柄作为方法名,下面的normalize_credit_card_number(有点像filter),可同时使用多个句柄
class Order < ActiveRecord::Base
before_validation :normalize_credit_card_number
after_create do |order|
logger.info "Order #{order.id} created"
end
protected
def normalize_credit_card_number
self.cc_number.gsub!(/-\w/, '' )
end
end
回调对象
除了在model中直接使用回调,还可以定义回调对象,这样就可以跨多个model使用
class CreditCardCallbacks
# Normalize the credit card number
def before_validation(model)
model.cc_number.gsub!(/-\w/, '' )
end
end
下面是回调对象如何在两个不同的类中激活的
class Order < ActiveRecord::Base
before_validation CreditCardCallbacks.new
# ...
end
class Subscription < ActiveRecord::Base
before_validation CreditCardCallbacks.new
# ...
end
Observers
回调可能使不相关的model联系在一起,通过observer可以避免这个缺陷
通过observer使用回调的功能
OrderObserver是Order模型的程序钩子,等同于在order模型内直接使用回调
class OrderObserver < ActiveRecord::Observer
def after_save(an_order)
an_order.logger.info("Order #{an_order.id} created" )
end
end
OrderObserver.instance
observer可以用于多个model
class AuditObserver < ActiveRecord::Observer
observe Order, Payment, Refund
def after_save(model)
model.logger.info("#{model.class.name} #{model.id} created" )
end
end
AuditObserver.instance
rails 常用的验证方法 validates (转)的更多相关文章
- java 常用的验证方法帮助类
import java.text.ParseException; import java.util.Collection; import java.util.Map; /** * 常用的验证方法帮助类 ...
- rails中validates_confirmation_of验证方法无效的解决办法
rails的model中提供了很多种自带的验证方法,validates_confirmation_of可以验证变量xxx和xxx_confirmation是否相等:这可以用于验证2遍输入的密码是否一致 ...
- VB的一些项目中常用的通用方法-一般用于验证类
1.VB的一些项目中常用的通用方法: ' 设置校验键盘输入值,数字 Public Function kyd(key As Integer) As Integer Dim mychar mychar = ...
- Struts2 验证框架 validation.xml 常用的验证规则
validation.xml 的命名规则和放置路径: 文件名:<ActionClassName>-validation.xml <ActionClassName>就是要验证的A ...
- jquery validate 自定义验证方法
query validate有很多验证规则,但是更多的时候,需要根据特定的情况进行自定义验证规则. 这里就来聊一聊jquery validate的自定义验证. jquery validate有一个方法 ...
- 干货:结合Scikit-learn介绍几种常用的特征选择方法
原文 http://dataunion.org/14072.html 主题 特征选择 scikit-learn 作者: Edwin Jarvis 特征选择(排序)对于数据科学家.机器学习从业者来说非 ...
- ASP.NET开发中主要的字符验证方法-JS验证、正则表达式、验证控件、后台验证
ASP.NET开发中主要的字符验证方法-JS验证.正则表达式.验证控件.后台验证 2012年03月19日 星期一 下午 8:53 在ASP.NET开发中主要的验证方法收藏 <1>使用JS验 ...
- 结合Scikit-learn介绍几种常用的特征选择方法
特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点.底层结构,这对进一步改善模型.算法都有着重要作用. 特征选择主要有两个功能: 减 ...
- jquery validate 自定义验证方法 日期验证
jquery validate有很多验证规则,但是更多的时候,需要根据特定的情况进行自定义验证规则. 这里就来聊一聊jquery validate的自定义验证. jquery validate有一个方 ...
随机推荐
- 12 个CSS 高级技巧汇总[转载]
使用 :not() 在菜单上应用/取消应用边框 给body添加行高 所有一切都垂直居中 逗号分隔的列表 使用负的 nth-child 选择项目 对图标使用SVG 优化显示文本 对纯CSS滑块使用 ma ...
- struts中Cookie实现记住密码
HttpServletRequest request = ServletActionContext.getRequest(); Cookie[] cookies = request.getCookie ...
- DFA敏感词过滤
import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java.util.ArrayList; ...
- class命名
常见class关键词: 布局类:header, footer, container, main, content, aside, page, section 包裹类:wrap, inner 区块类:r ...
- python——进程基础
我们现在都知道python的多线程是个坑了,那么多进程在这个时候就变得很必要了.多进程实现了多CPU的利用,效率简直棒棒哒~~~ 拥有一个多进程程序: #!/usr/bin/env python #- ...
- 检查失败,<master>分支有过其他更新,请先在本地合并<master>分支的代码
- java 简单数组元素的增删改查
public class Test { static int[] a = new int[20]; static int n; public static void main(String[] arg ...
- JavaScript 面向对象(三) —— 高级篇
JavaScript 面向对象(一) —— 基础篇 JavaScript 面向对象(二) —— 案例篇 一.json方式的面向对象 首先要知道,js中出现的东西都能够放到json中.关于json数据格 ...
- PHP实现微信公众平台开发 全套视频资源下载
好久没有在博客园更新东西了,今天给大家分享一份比较不错的视频学习资源吧. 主要是关于PHP实现微信公众平台开发, 不知道大家对于微信平台的开发有多少了解,那么今天就从基础开始吧,资源目录如下(PS ...
- 四核RP4412开发板使用Xshell连接的com口应与电脑端口一致
使用Xshell工具连接的com口要与电脑接的com口端号一样. 问:我的RP4412开发板现在按照<烧写视频>操作,在XSHELL软件里找不到板子的串口号.我用的XP系统装了USB转串口 ...