`
sillycat
  • 浏览: 2543493 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Rails Study(VII)Validations and Callbacks

阅读更多
Rails Study(VII)Validations and Callbacks

1. The Object Life Cycle
Validations allow you to ensure that only valid data is stored in database.
Callbacks and observers allow you to trigger logic before or after an alteration of an object's state.

2. Validations Overview
2.1 Why Use Validations?
native database constraints,
client-side validations,
controller-level validations,
model-level validations

2.2 When Does Validation Happen?
>rails generate model Person name:string
>rake db:migrate
It really strange, the newly created table named People, the model class named person.rb.

Open rails console and have a test
>rails console
> p = Person.new(:name => 'Carl')
=> #<Person id: nil, name: "Carl", created_at: nil, updated_at: nil>
> p.new_record?
=> true
> p.save
  SQL (13.0ms)  BEGIN
  SQL (701.0ms)  INSERT INTO `people` (`created_at`, `name`, `updat
ed_at`) VALUES (?, ?, ?)  [["created_at", Fri, 05 Aug 2011 06:04:37 UTC +00:00],
["name", "Carl"], ["updated_at", Fri, 05 Aug 2011 06:04:37 UTC +00:00]]
   (1.0ms)  COMMIT
=> true
> p.new_record?
=> false

There are 2 kinds of objects. One is saved in database, one has no relationship with database yet.

2.3 Skipping Validations
save(:validate => false)

2.4 valid? and invalid?
class Person < ActiveRecord::Base
  validates :name,  :presence =>true
end

> Person.create(:name=>"carl").valid?
=> true
> Person.create(:name=>nil).valid?
=> false

>>p = Person.new
>>p.valid?
=>false
>>p.errors
=>{:name=>["can't be blank"]}

2.5 errors[]
errors[:attribute], it returns an array of all the errors for :attribute.
>>Person.new.errors[:name].any?
=> false
>>Person.create.errors[:name].any?
=> true
>>Person.create.errors[:name]
=> ["can't be blank"]

3. Validation Helpers
3.1 validates_acceptance_of
Validates that a checkbox on the user interface was checked when a form was submitted.
validates_acceptance_of :terms_of_service

3.2 validates_associated
has_many :books
validates_associated :books

3.3 validates_confirmation_of
We need to use this helper when we have 2 text fields that should receive exactly the same content.
class Person < ActiveRecord::Base
   validates_confirmation_of :email
   validates_presence_of :email_
end

<%= text_field :person, :email %>
<%= text_field :person, :email_confirmation %>

3.4 validates_exclusion_of
3.5 validates_format_of
validates_format_of :legacy_code, :with => /\A[a-zA-Z]+\z/, :message => "only leters allowed"

3.6 validates_inclusion_of
3.7 validates_length_of
validates_length_of :name, :minimum =>2
validates_length_of :name, :maximum => 500
validates_length_of :password, :in => 6..20            #:in(or :within) the attribute length must be included in a given interval.
validates_length_of :registration_number, :is => 6   # the attribute length must be equal to the given value

validates_length_of :bio, :maximum =>1000, :too_long => "%{count} characters is the maximum allowed"

3.8 validates_numericality_of
validates_numericality_of :points
validates_numericality_of :games_played,nly_integer => true

:greater_than
:greater_than_or_equal_to
:equal_to
:less_than
:less_than_or_equal_to
:odd
:even

3.9 validates_presence_of
class Person < ActiveRecord::Base
  validates_presence_of :name
end

>>Person.create.valid?
=> false
>>Person.create(:name=>'joan').valid?
=> true

validates_presence_of :name, :login, :email

3.10 validates_uniqueness_of
validates_uniqueness_of :email
validates_uniqueness_of :name :case_sensitive => false

3.11 validates_with
3.12 validates_each

4. Common Validation Options
4.1 :allow_nil
4.2 :allow_blank
4.3 :message
4.4n
Then option lets you specify when the validation should happen.
class Person < ActiveRecord::Base
    validates_uniqueness_of :email,n => :create
    validates_numericality_of :age,n => :update
    validates_presence_of :name,n => :save
end

5. Conditional Validation
5.1 Using a Symbol with :if and :unless
class Order < ActiveRecord::Base
   validates_presence_of :card_number, :if => :paid_with_card?

   def paid_with_card?
     payment_type == "card"
   end
end

5.2 Using a String with :if and :unless
validates_presence_of :surname, :if => "name.nil?"

5.3 Using a Proc with :if and :unless
6 Creating Custom Validation Methods
class Invoice < ActiveRecord::Base
   validate :expiration_date_cannot_be_in_the_past,
              :discount_cannot_be_greater_than_total_value

   def expiration_date_cannot_be_in_the_past
      errors.add(:expiration_date, "can't be in the past") if
         !expiration_date.blank? and expiration_date < Date.today
   end

   def discount_cannot_be_greater_than_total_value
      errors.add(:discount, "can't be greater than total value") if
        discount > total_value
   end
end

references:
http://guides.rubyonrails.org/active_record_validations_callbacks.html

分享到:
评论

相关推荐

    Rails.Angular.Postgres.and.Bootstrap.2nd.Edition

    Wrangle Forms and Validations with Angular Chapter 13. Dig Deeper Appendix A1. Full Listing of Customer Detail Page HTML Appendix A2. Creating Customer Address Seed Data Appendix A3. How Webpack ...

    Ruby on Rails_ Up and Running

    RUBY的经典之作,对其在RAILS下开发写得很详细

    ruby.on.rails.up.and.running

    《Ruby on Rails Up and Running》是一本专注于介绍Ruby on Rails框架的书籍,旨在帮助开发者快速上手并深入了解这个强大的Web开发平台。Ruby是一种面向对象的编程语言,以其简洁、优雅的语法著称,而Rails是基于...

    Rails3 device and cancan

    标题《Rails3 device and cancan》与描述《ROR ruby on rails device plugin教程》指出本文是关于如何在Rails 3.2应用程序中整合Devise认证插件和Cancan授权插件的教程。Devise是一个流行的Ruby on Rails的认证解决...

    [Rails] Crafting Rails Applications (英文版)

    This pioneering book is the first resource that deep dives into the new Rails 3 APIs and shows you how use them to write better web applications and make your day-to-day work with Rails more ...

    Agile Web Development with Rails 4

    You concentrate on creating the application, and Rails takes care of the details., Tens of thousands of developers have used this award-winning book to learn Rails. It’s a broad, far-reaching ...

    The Rails3 Way, 2nd Edition

    Ruby on Rails strips complexity from the development process, enabling professional developers to focus on what matters most: delivering business value via clean and maintainable code. The Rails™ 3 ...

    Ruby on Rails: Up and Running

    《Ruby on Rails: Up and Running》是一本针对初学者和有经验开发者的技术书籍,它深入浅出地介绍了如何使用Ruby on Rails框架构建Web应用程序。Ruby on Rails(简称Rails)是基于Ruby编程语言的一个开源Web应用框架...

    Rails, Angular, Postgres, and Bootstrap(2nd) epub

    Rails, Angular, Postgres, and Bootstrap(2nd) 英文epub 第2版 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除

    rails2-sample

    从给定的文件信息来看,我们正在探讨的是一本关于Ruby on Rails的书籍,书名为《Simply Rails2》,作者是Patrick Lenz。本书旨在为初学者提供深入理解Ruby on Rails框架的指南,从基础概念到高级主题均有涵盖,是...

    unity插件 Tracks and Rails.unitypackage 铁路轨道生成

    这个扩展允许您创建任何自定义形状的轨道,然后将一个购物车附加到它,并实际骑在轨道上。让平台在受到撞击时能滑动,地铁列车撞到障碍物,坏掉的电梯,过山车,看不见的飞行路线,火箭推进的火车等等!...

    rails 5 test prescriptions build a healthy codebase

    Your Ruby on Rails ...This new edition has been updated to Rails 5.2 and RSpec 3.7 and contains full coverage of new Rails features, including system tests and the Webpack-based JavaScript setup.

    Rails项目源代码

    Ruby on Rails,通常简称为Rails,是一个基于Ruby编程语言的开源Web应用框架,遵循MVC(Model-View-Controller)架构模式。这个“Rails项目源代码”是一个使用Rails构建的图片分享网站的完整源代码,它揭示了如何...

    Rails101_by_rails4.0

    《Rails101_by_rails4.0》是一本专注于Rails 4.0.0版本和Ruby 2.0.0版本的自学教程书籍,它定位于中文读者,旨在成为学习Rails框架的参考教材。Rails(Ruby on Rails)是一个采用Ruby语言编写的开源Web应用框架,它...

    [Rails] Crafting Rails 4 Applications (英文版)

    This second edition of the bestselling Crafting Rails Applications has been updated to Rails 4 and discusses new topics such as streaming, mountable engines, and thread safety. ☆ 出版信息:☆ [作者...

Global site tag (gtag.js) - Google Analytics