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 (转)的更多相关文章

  1. java 常用的验证方法帮助类

    import java.text.ParseException; import java.util.Collection; import java.util.Map; /** * 常用的验证方法帮助类 ...

  2. rails中validates_confirmation_of验证方法无效的解决办法

    rails的model中提供了很多种自带的验证方法,validates_confirmation_of可以验证变量xxx和xxx_confirmation是否相等:这可以用于验证2遍输入的密码是否一致 ...

  3. VB的一些项目中常用的通用方法-一般用于验证类

    1.VB的一些项目中常用的通用方法: ' 设置校验键盘输入值,数字 Public Function kyd(key As Integer) As Integer Dim mychar mychar = ...

  4. Struts2 验证框架 validation.xml 常用的验证规则

    validation.xml 的命名规则和放置路径: 文件名:<ActionClassName>-validation.xml <ActionClassName>就是要验证的A ...

  5. jquery validate 自定义验证方法

    query validate有很多验证规则,但是更多的时候,需要根据特定的情况进行自定义验证规则. 这里就来聊一聊jquery validate的自定义验证. jquery validate有一个方法 ...

  6. 干货:结合Scikit-learn介绍几种常用的特征选择方法

    原文  http://dataunion.org/14072.html 主题 特征选择 scikit-learn 作者: Edwin Jarvis 特征选择(排序)对于数据科学家.机器学习从业者来说非 ...

  7. ASP.NET开发中主要的字符验证方法-JS验证、正则表达式、验证控件、后台验证

    ASP.NET开发中主要的字符验证方法-JS验证.正则表达式.验证控件.后台验证 2012年03月19日 星期一 下午 8:53 在ASP.NET开发中主要的验证方法收藏 <1>使用JS验 ...

  8. 结合Scikit-learn介绍几种常用的特征选择方法

    特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点.底层结构,这对进一步改善模型.算法都有着重要作用. 特征选择主要有两个功能: 减 ...

  9. jquery validate 自定义验证方法 日期验证

    jquery validate有很多验证规则,但是更多的时候,需要根据特定的情况进行自定义验证规则. 这里就来聊一聊jquery validate的自定义验证. jquery validate有一个方 ...

随机推荐

  1. 关于C语言结构体,指针,声明的详细讲解。——Arvin

    关于结构体的详细分析 只定义结构体 struct Student { int age; char* name; char sex;//结构体成员 };//(不要忘记分号) Student是结构体的名字 ...

  2. Android 升级SQLite数据库

    每一个数据库版本都会对应一个版本号,当指定的数据库版本号大于当前数据库的版本号时,就会进入到onUpGrade()方法中去执行更新操作.需要为每一个版本号赋予其各自改变的内容然后再onUpgrade( ...

  3. 不使用插件实现对WordPress默认编辑器的增强

    四处寻觅无果.无意看了一下wordpress官方的API函数.苍天有眼啊!原来,后台的编辑器可以插入很多增强功能.果断卸载掉CK and SyntaxHighlighter编辑器插件.事实上,Word ...

  4. Access使用join进行多个表联合查询的问题

    Access是支持三表或三表以上的join查询的,但是要加括号,如果不加的话,会报错,括号的作用是决定join的顺序.例如: SELECT *FROM (aa LEFT JOIN bb ON aa.a ...

  5. SPSS数据分析—两阶段最小二乘法

    传统线性模型的假设之一是因变量之间相互独立,并且如果自变量之间不独立,会产生共线性,对于模型的精度也是会有影响的.虽然完全独立的两个变量是不存在的,但是我们在分析中也可以使用一些手段尽量减小这些问题产 ...

  6. 区分IE版本的三个方法

    我们通常使用IE条件判断语言来处理IE的CSS问题,但其实还是有其他的一些方法来处理IE的CSS bug的. 一.IE条件判断语句 IE条件判断语句也许是用的最多的区分IE版本(IE6, IE7, I ...

  7. VA01复制单据,更新定价日期和价格

    用户经常复制单据,而复制单据的时候会带过来很多日期的历史数据.定价日期就是其中之一,而价格经常变动,或者删除的话,会出现价格错误等等情况. 1.更新定价日期,保证不会使用历史价格. 2.更新价格,保证 ...

  8. ListView 的使用

    一.ListView:不同视图中一种显示想的集合,显示表格样式的数据信息1.视图:            在其右上方小箭头点击将视图改为Details:或者右键属性在外观View将其改为Details ...

  9. ionic 通过PouchDB + SQLite来实现app的本地存储(Local Storage)

    首先声明,本教程参考国外网站(http://gonehybrid.com/how-to-use-pouchdb-sqlite-for-local-storage-in-your-ionic-app/) ...

  10. Vue2.X的状态管理vuex记录

    记住上述的顺序情况:想要改变state,只能通过Mutation,虽然action可以直接改变state,这样会使每个状态可以方便的跟踪和记录(用Devtools跟踪) vue Method   -- ...