免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3688 | 回复: 6
打印 上一主题 下一主题

rails3.0新的验证方法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-27 12:48 |只看该作者 |倒序浏览
转:ruby
rails3.0新的验证方法

rails3.0新的验证方法已经从Active Model中抽取出来,它接受一个属性和哈稀验证选项,不在像3.0以前针对每个属性使用一个验证方法,极大的简化了验证流程.

以前的方法虽然还在,但不推荐使用了,因为我们够懒.

下面我们先来看一个简单的示例:
  1. class Person < ActiveRecord::Base  

  2.      validates :email, :presence => true

  3. end
复制代码
新的验证方法接收以下选项:
  1. 1. :acceptance => Boolean  

  2. 2.  :confirmation => Boolean  

  3. 3.  :exclusion => { :in => Ennumerable }  

  4. 3.  :inclusion => { :in => Ennumerable }  

  5. 4.  :format => { :with => Regexp }  

  6. 5.  :length => { :minimum => Fixnum, maximum => Fixnum, }  

  7. 6.  :numericality => Boolean  

  8. 7.  :presence => Boolean  

  9. 8.  :uniqueness => Boolean
复制代码
更容易使用的验证选项,让验证更加轻松,我们以一个比较完整的验证用户名和电子邮件作为示例:
  1. # app/models/person.rb  

  2. class User < ActiveRecord::Base  

  3.    validates :name,  :presence => true,  

  4.                      :length => {:minimum => 1, :maximum => 254}  

  5.                        

  6.    validates :email, :presence => true,   

  7.                      :length => {:minimum => 3, :maximum => 254},  

  8.                      :uniqueness => true,  

  9.                      :format => {:with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i}  

  10. end
复制代码
从示例中我们可以看到,模型的各个属性以及要进行何种验证,代码的可读性也得到了提升.

在了解rails 3.0验证方法的基本使用方法后,我们来看下一些更高级的应用.
当用户分为不同的等级,如游客,用户,客户等,它们共用preson模型,这时我们可以应用: validates_with
  1. # app/models/person.rb  

  2. class User < ActiveRecord::Base  

  3.    validates_with HumanValidator  

  4. end  
  5.    
  6. # app/models/person.rb  

  7. class Visitor < ActiveRecord::Base  

  8.    validates_with HumanValidator  

  9. end  
  10.    
  11. # app/models/person.rb  

  12. class Customer < ActiveRecord::Base  

  13.    validates_with HumanValidator  

  14. end
复制代码
然后在你项目的lib目录创建以下文件
  1. class HumanValidator < ActiveModel::Validator  
  2.    

  3.   def validate(record)  

  4.      record.errors[:base] << "This person is dead" unless check(human)  

  5.   end  

  6.    
  7.    private
  8.    

  9.      def check(record)  

  10.        (record.age < 200) && (record.age > 0)  

  11.      end  

  12. end
复制代码
启动控制台,运行以下代码,你就会看到效果:
  1. $ ./script/console  

  2. Loading development environment (Rails 3.0.pre)  

  3. >> u = User.new

  4. => #<User id: nil, name: nil, email: nil, created_at: nil, updated_at: nil>  

  5. >> u.valid?  

  6. => false

  7. >> u.errors  

  8. => #<OrderedHash {:base=>["This person is dead"]}>
复制代码

论坛徽章:
0
2 [报告]
发表于 2010-12-27 14:15 |只看该作者
3.0?很新啊。

论坛徽章:
0
3 [报告]
发表于 2010-12-27 14:46 |只看该作者
回复 2# 2gua


    2瓜哥,咱要不要翻译下rails3

论坛徽章:
0
4 [报告]
发表于 2010-12-27 15:24 |只看该作者
回复 3# sykp241095


    好想法啊,你准备翻译哪部呢?

论坛徽章:
0
5 [报告]
发表于 2010-12-27 15:34 |只看该作者
回复 4# 2gua


    。。。权威,官方文档呗,,,

论坛徽章:
0
6 [报告]
发表于 2010-12-27 15:54 |只看该作者
回复 5# sykp241095


    官方文档?量很大哦。

论坛徽章:
0
7 [报告]
发表于 2010-12-28 11:27 |只看该作者
回复  2gua


    。。。权威,官方文档呗,,,
sykp241095 发表于 2010-12-27 15:34



    精神上支持!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP