`

ActiveRecord验证和回调1

阅读更多


1 对象的生命周期
在操作Rails应用程序期间,对象能够create, update和destroyed。ActvieRecord在这些对象的生命周期中提供了钩子,让你能控制应用程序的数据。
验证允许你只把有效的数据写入数据库,callbacks和observers允许你在改变对象状态的前后触发业务逻辑。

2 验证概述
2.1 为什么要使用验证?
验证能够让你只把有效的数据存入数据库。例如,在应用程序中要确保用户提供的email地址和邮寄地址正确。

在把数据存入数据库之前,有几个方法可以验证数据。包括:数据库限制,客户端验证,控制器层验证和模型层验证。
* 使用数据库限制验证数据,构造验证数据库依赖,测试和维护是相当困难的。如果你的数据库被其他应用使用,在数据库层使用限制可能是一个好主意。数据库层验证可以安全的处理一些事(比如验证唯一性),其他方法可能难以实施。
* 客户端验证是有用的,但是单独使用,通常是不可靠的。如果它们使用JavaScript来实现,要是用户关闭掉浏览器的JavaScript解释器,那这些验证就会被忽略掉。然而如果配合其它的一些技巧,客户端验证能够立即给用户提供反馈。
* 控制器层验证的使用是很诱人的。但是通常给测试和维护带来困难。无论何时,让控制器保持小是一个好主意。因为可以让你的应用程序长时间轻松的工作。
* 模型层验证是确保正确的数据存入数据库最好的方法。这些验证不能被用户忽略,并且能很方便的测试和维护。Rails构造模型层验证是相当容易的,它为普通的需求提供了内建的辅助方法,并允许创建你自己的验证方法。

2.2 当验证时发生了什么?
当你创建一个新对象时,对象符合数据库表中的行。例如使用new方法,这些对象并没有马上存到数据库中,要保存到数据库表,还要调用save方法。Active Record使用new_record?实例方法来判断对象是否已经在数据库中了。看一下下面的例子?
class Person < ActiveRecord::Base
end
我们使用script/console来看看它是怎么工作的。
>> p = Person.new(:name => "John Doe")
=> #<Person id: nil, name: "John Doe", created_at: nil, :updated_at: nil> 
>> p.new_record?
=> true
>> p.save
=> true
>> p.new_record?
=> false

创建和保存一条新记录将发送一条SQL的INSERT操作给数据库,更新一条记录会发送一条SQL的UPDATE操作给数据库。验证是在这些命令发送到数据库之前运行的。如果验证失败,对象就会被标记为无效的,Active Record将不会执行INSERT或UPDATE操作。这些辅助方法就不会把无效的数据保存到数据库中。当一个对像被创建、保存或更新时,可以选择具体的验证方法。

在数据库中,有很多方法可以改变对象的状态。一些方法会触发验证,一些则不会。如果不小心使用,会把无效的数据写入数据库的。

下列方法会触发验证,如果对象是有效的,便会保存到数据库中。
* create
* create!
* save
* save!
* update
* update_attributes
* update_attributes!
如果记录是无效的,有叹号的方法会抛出一个异常。没有叹号的方法就不会了。save和update_attributes返回false,create和update返回对象。

2.3 跳过验证
下面的方法会跳过验证,不管数据是否有效,都保存到数据库,这些方法要小心使用:
* decrement!
* decrement_counter
* increment!
* increment_counter
* toggle!
* update_all
* update_attribute
* update_counters

注意:如果save方法通过false参数也可以跳过验证的。
* save(false)

2.4 valid?和invalid?
Rails使用valid?方法来验证数据是否有效。如果没有返回错误,会返回true,否则返回false。

class Person < ActiveRecord::Base
validates_presence_of :name
end

Person.create(:name => "John Doe").valid? # => true
Person.create(:name => nil).valid? #=> false

注意使用new时,如果数据无效,将不会产生错误报告。因为当使用new时,验证并没有运行。
class Person < ActiveRecord::Base
validates_presence_of :name
end

>> p = Person.new
=> #<Person id:nil, name:nil>
>> p.erros
=> #<ActiveRecord::Errors..., @errors={}>

>> p.valid?
=> false
>> p.erros
=> #<ActiveRecord::Errors..., @errors={"name"=>["can't be blank"]}>

>> p = Person.create
=> #<Person id: nil, name: nil>
>> p.errors
=> #<ActiveRecord::Errors..., @errors={"name"=>["can't be blank"]}>

>> p.save
=> false

>> p.save!
=> ActiveRecord::RecordInvalid: Validation failed: Name can't be blank 

>> Person.create!
=> ActiveRecord::RecordInvalid: Validation failed: Name can't be blank 

invalid?是valid?的逆操作。如果添加对产生错误,就触发验证并回true。

2.5 errors.invalid?
为了验证对象的属性是否为有效,可有使用erros.invalid?方法。这个方法仅在验证之后运行。因为它仅检查错误,并不触发验证。这和ActiveRecord::Base:invalid?方法是不同的,因为它不检查数据的有效性。它仅检测对象的具体属性是否有错误。
class Person < ActiveRecord::Base
validates_presence_of :name
end

>> Person.new.errors.invalid?(:name) #=> false
>> Person.create.errors.invalid?(:name) #=> true

 

form:http://hi.baidu.com/haifreeidea/blog/item/d83675c97f7f321f7d3e6f64.html

分享到:
评论

相关推荐

    Pro ActiveRecord Databases with Ruby and Rails.pdf

    5. **回调**: 在模型的生命周期中可以定义各种回调函数,例如在保存之前或之后执行某些操作。 6. **自定义方法**: 可以在模型类中定义自定义的方法,实现特定的业务逻辑。 #### 五、高级用法 1. **分页**: 使用...

    ActiveRecord简单实例代码.zip

    ActiveRecord支持在特定生命周期事件(如创建、更新、删除等)前后执行的回调函数。例如,`before_save :normalize_email`会在保存用户前自动规范化电子邮件地址。 8. **序列化** ActiveRecord允许你序列化复杂的...

    sneaky-save:允许更新复杂的对象而无需触发验证或回调

    允许保存记录而无需调用回调和验证。 正在安装 $ gem install sneaky-save 或放入您的gemfile以获取最新版本: gem 'sneaky-save' , git : 'git://github.com/einzige/sneaky-save.git' 使用 # Update. Returns ...

    noar:NodeJS ActiveRecord

    事务(基于异步钩子,因此您无需将代码包装到回调中) 基于knex.js(因此您拥有knex查询构建器的所有功能) 声明范围,关系,验证 Yaml夹具,用于播种测试数据并在测试中使用 级联保存 包含有限状态机 容易的多态...

    Ruby-ActiveModel的自定义验证用于检查数组是否包含在另一个中

    在ActiveModel中,可以通过定义一个验证方法并在`validate`回调中调用来实现。下面是一个简单的示例: ```ruby class MyModel attr_accessor :input_array validate :intersection_validation private def ...

    from-activerecord-to-ecto:包含示例的指南,以帮助从ActiveRecord过渡到Ecto

    开发人员使用ActiveRecord所做的大部分工作都使数据模型对所有使用者都具有相同的功能(通过使用验证和回调),而Ecto鼓励使用不太严格的行为。 尽管可以在ActiveRecord中定义这些边界(请考虑 ),但是某些应用...

    Ruby on Rails 指南 v5.0.1 中文版

    - **回调**:解释ActiveRecord中可用的生命周期回调,以及如何利用这些回调增强模型的功能。 - **迁移**:介绍如何使用迁移来管理和维护数据库结构的变化。 #### ActiveRecord迁移 - **迁移概述**:解释迁移的概念...

    验证_锻炼

    1. **ActiveRecord验证**:在Ruby on Rails中,ActiveRecord模型提供了内置的验证工具,例如`validates`, `validates_format_of`, `validates_length_of`等,这些方法可以帮助开发者检查模型实例的数据是否符合预设...

    active_type:使任何Ruby对象像ActiveRecord一样发出嘎嘎声

    但是,我们不想失去ActiveRecord的便利,例如验证,回调等。 用例示例是支持登录的模型: class SignIn &lt; ActiveType :: Object # this is not backed by a db table attribute :username , :string ...

    ActiveRecord生命周期阅读v-000

    目标了解AR生命周期方法的概念使用before_save , before_create和before_validation 了解何时使用before_validation与before_save回呼现在,我们将ActiveRecord集成到Rails中,我们应该注意,只要模型中发生某些...

    activerecord-lifecycle-reading-onl01-seng-ft-050420

    我们在这里介绍的所有内容都称为“活动记录生命周期回调”。 很多人都称它们为回调。 有点短。 看一下其中包含的博客应用程序。 在开始向Rails学习之前,请确保运行迁移(我们使用rake db:migrate做到了!)! ...

    activerecord-lifecycle-reading-online-web-sp-000

    我们在这里介绍的所有内容都称为“活动记录生命周期回调”。很多人都称它们为回调。有点短。 看一下其中包含的博客应用程序。在开始向Rails学习之前,请确保运行迁移(我们使用rake db:migrate做到了!)!我们有一...

    serialize_has_many:将has_many关系序列化为单个列。 使用ActiveRecord轻松实现NoSQL!

    serialize_has_many 将has_many关系序列化为单个列,同时仍在进行属性,验证,回调,嵌套表单和fields_for。 使用ActiveRecord轻松实现NoSQL!安装将此行添加到您的应用程序的Gemfile中: gem 'serialize_has_many' ...

    RoR 培训课程PPT

    - **关联、验证及回调**:深入讲解ActiveRecord中的关联关系(如一对一、一对多等),以及如何进行数据验证和回调函数的应用。 - **ActionView表单**:学习如何在视图层构建动态表单,利用ActionView提供的模板...

    sequel-activemodel-源码.rar

    Sequel Activemodel的结合使得在Sequel中可以使用ActiveRecord的一些特性,如验证、序列化和回调等,增强了Sequel的功能性和灵活性。 首先,我们来看看Sequel的核心概念。Sequel的核心是Dataset对象,它代表了...

    Ruby-OmniAuth利用Rack中间件的一个灵活认证系统

    OmniAuth 中间件会处理这个回调,解析出用户的标识符(通常称为 "uid")和其他信息,然后这些信息可以通过 `request.env['omniauth.auth']` 访问。 OmniAuth 还提供了丰富的自定义选项,比如可以在回调处理中添加...

    Ruby-ActiveAttr一组模块让用户可以更方便地创建普通带功能的Ruby模型

    5. **Callbacks**:回调机制,可以在特定事件(如`before_create`、`after_update`等)发生时执行代码。 6. **Typecasting**:类型转换,允许你指定属性的类型,如`attribute :age, type: Integer`,自动将字符串...

    rails-2.3.3.zip

    在2.3.3版中,ActiveRecord支持复杂的查询,如关联(associations)和回调(callbacks),以及ActiveRecord验证(validations)确保数据的完整性。 3. **ActionController**:处理HTTP请求并生成响应。在2.3.3中,...

    Laravel开发-beyonic

    2. **配置 API 访问凭证**:在 Laravel 的 `.env` 文件中设置 Beyonic 的 API 密钥和回调URL。 3. **创建支付请求**:利用 Beyonic PHP 客户端库,编写支付逻辑,生成支付请求,并将请求信息展示给用户。 4. **处理...

    Ruby on Rails源代码

    你可以学习如何定义属性、关系(如一对多、多对多)、验证和回调。 3. **控制器**:`app/controllers`目录下的文件是Rails应用的核心部分,它们处理HTTP请求并调用模型和视图。控制器类定义了各种行动,这些行动...

Global site tag (gtag.js) - Google Analytics