- 浏览: 215699 次
- 性别:
- 来自: 绍兴
文章分类
最新评论
-
112703013:
你好, 想问个问题 就是我这边上传一个zip文件 大概有100 ...
rails文件上传下载和删除 . -
chen_miao:
qplovechinese 写道 很好!
3q
simple jQuery date-picker plugin 使用 -
qplovechinese:
很好!
simple jQuery date-picker plugin 使用
5 有条件的验证
有时要满意一些条件才进行数据验证,这就可以使用:if和:unless选项,并指定一个符号,字符串或者Proc对象给选项。
5.1 使用符号的:if和:unless
给:if和:unless选项,指定一个符号,在验证发生之前就会调用这个方法。
class Order < ActiveRecord::Base
validates_presence_of :card_number, :if => :paid_with_card?
def paid_with_card?
payment_type == "crad"
end
end
5.2 使用字符串的:if和:unless
可以指定一个字符串给:if和:unless选项,字符串是Ruby代码,通过eval执行。
class Person < ActiveRecord::Base
validates_presence_of :surname, :if => "name.nil?"
end
5.3 使用过Proc对象
给:if和:unless指定一个Proc对象,就可以写一个内联条件,而不是单独的方法。此选项最合适在一行。
class Account < ActiveRecord::Base
validates_confirmation_of :password,
:unless => Proc.new{|a| a.password.black?}
end
6 创建自定义验证方法
当内建的验证辅助方法不能满足需要时,就可以自己编写验证方法。
在模型中创建验证方法,当验证无效时,错误信息会添加到errors集合中。必须用验证方法的符号名字给注册validate, validate_on_create或者validate_on_update注册。
class Invoice < ActiveRecord::Base
validate :expiration_date_cannot_be_in_the_past, :discount_cannot_be_greater_than_total_vlaue
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
甚至还可以创建自己的验证辅助方法,在其它模型中使用。例如:
ActiveRecord::Base.class_eval do
def self.validates_as_radio(attr_name, n, options={})
validates_inclusion_of attr_name, {:in => 1.. n}.merge(options)
end
end
例子中是重新把ActiveRecord::Base打开,并定义了一个类方法。上面的代码可以放在config/initializers中。
class Movie < ActiveRecord::Base
validates_as_radio :rating, 5
end
7 工作与验证错误
Rails为验证对象的有效性提供了一些方法与错误的集合。
下面列出来常用的使用方法:
7.1 errors.add_to_base
该方法给对象状态增加错误信息,并看作是一个整体。当要描述对象是无效时可以使用这个方法,不用去管属性的值。方法参数接受一个字符串。
class Person < ActiveRecord::Base
def a_method_used_for_validation_purposes
errors.add_to_base("This person is invalid because ...")
end
end
7.2 errors.add
该方法让你手动添加与特定属性相关的信息,可以使用full_messages方法显示信息。在特定信息的前面加上首字母大写的名称。
class Person < ActiveRecord::Base
def a_method_used_for_validation_purposes
errors.add(:name, "cannot contain the characters !@#%*()_-+=")
end
end
person = Person.create(:name => "!@#")
person.errors.on(:name)
# => "cannot contain the characters !@#%*()_-+="
person.errors.full_message
# => ["Name cannot contain the characters !@#%*()_-+="]
7.3 errors.on
当检测特定属性的错误信息时,就可以使用这个方法。根据属性错误集合的状态返回不同的对象。如果没有错误就返回nil。当有两个或者更多的错误信息时,就返回数组。
class Person < ActiveRecord::Base
validates_presence_of :name
validates_length_of :name, :minimum => 3
end
person = Person.new(:name => "John Doe")
person.valid? #=> true
person.errors.on(:name) # => nil
person = Person.new(:name => "JD")
person.valid? # => false
person.errors.on(:name)
# => "is too short (minimum is 3 characters)"
person = Person.new
person.valid? # => false
# => ["can't be blank", "is too short (minimum is 3 characters)"]
7.4 errors.clear
当想要清除errors中的信息时,就可以使用这个方法。当然,无效的对象依然是无效的,只是errors集合被清空了,当再次调用valid?或者尝试保存对象到数据库时,仍然要进行验证。如果验证失败,错误信息就保存在errors集合中。
class Person < ActiveRecord::Base
validates_presence_of :name
validates_length_of :name, :minimum => 3
7.5 errors.size
返回对象的错误信息的总数。
class Person < ActiveRecord::Base
validates_presence_of :name
validates_length_of :name, :minimum => 3
validates_presence :email
end
person = Person.new
person.valid? # => false
person.errors.size # => 3
person = Person.new(:name => "Andrea", :email => "andrea@example.com")
person.valid? # => true
person.errors.size # => 0
8 在视图中显示验证错误
Rails提供了一些内建的辅助方法用来在视图中显示错误信息。
8.1 error_messags and error_messages_for
当用form_for辅助方法创建一个表单时,就可以使用error_messages方法在表单中为当前的模型对象渲染所有验证的错误信息。
class Product < ActiveRecord::Base
validates_presence_of :description, :value
validates_numericality_of :value, :allow_nil => true
end
<% form_for(@product) do |f| %>
<%= f.error_messages %>
<p>
<%= f.label :description %> <br />
<%= f.text_field :value %>
</p>
<p>
<%= f.label :value %>
<%= f.text_field :value %>
</p>
<p>
<%= f.submit "Create" %>
</p>
<% end %>
也可以在视图中使用error_messages_for辅助方法显示验证错误信息。
<%= error_messages_for :product %>
这两个方法都接受自定义信息的头部和信息提示。
<%= f.error_messages :header_message => "Invalid product!", :message => "You'll need to fix the following fields:", :header_tag => :h3 %>
8.2 自定义错误信息的CSS风格
错误信息的CSS选择器:
* .fieldWithErrors 表单栏目的标签风格
* #errorExplanation 错误信息div元素的风格
* #errorExplanation h2 错误信息div元素头部的风格
* #errorExplanation p 错误信息div元素中出现在头部下面段落的风格
* errorExplanation ul li 个别错误信息的列表风格
8.3 自定义错误信息的HTML
默认情况下,表单栏目的错误信息是通过CSS中的fieldWithErrors样式附在div元素中的。然而,这是可以改变的。
表单栏目的错误信息通过ActionView::Base.field_error_proc来定义。这是一个一个Proc接受两个参数:
* 一个HTML标记的字符串
* 一个ActionView::Helpers::InstanceTag对象
下面是一个简单的例子:
ActiveView::Base.field_error_proc = Proc.new do |html_tag, instance|
if instance.error_message.kind_of?(Array)
%(#{html_tag}<span class="validation-error")
#{instance.error_message.join(',')}</span>)
else
%(#{html_tag}<span class="validation-error")
#{instance.error_message}</span>)
end
end
发表评论
-
require,include,load,extend的用途和区别
2013-03-01 22:47 980这四个方法还是很好玩很有用,也是比较容易混的。 ... -
ruby 标准类型总结
2013-02-01 16:45 1243一、数字 Ruby支持整数 ... -
RMagick 简介
2013-01-18 20:38 1416RMagick 是一个将 Ruby 语言绑定到 ImageM ... -
ARP欺骗功能
2013-01-12 22:47 1158一、设置前准备 当使用了防止ARP欺骗功能(IP和 ... -
淘宝开源编辑器KISSY Editor
2013-01-04 16:46 2380KISSY Editor 是开源项目 KISSY ... -
Rails创建定时任务
2012-12-10 10:21 1849Task & Rexcel 最终生成的报 ... -
Ruby on Rails页面缓存 实践
2012-12-05 11:02 1075三种方式 Page Caching, Action ... -
rails缓存学习
2012-11-27 16:38 1892FORM:http://kenbeit.com/tag/ ... -
Ruby on Rails 简单页面缓存
2012-11-16 17:28 1233三种方式 Page Caching, Action Ca ... -
Ruby写入Excel文件 插件方法
2012-11-01 16:21 1530spreadsheet插件(主要是excel生成写入数 ... -
RUBY操作EXCEL文件
2012-10-31 17:05 1422使用ruby来操作excel文 ... -
Ruby on Rails的session和session存储方案
2012-10-18 17:42 1289session:页面间的信息保存手段。使用:赋值 ses ... -
Ruby程序打包成可执行文件的工具 - RubyScript2Exe
2012-09-19 21:28 2280RubyScript2Exe能够将你的Ruby应用程序转成一个 ... -
rails中实现kindeditor中的图片上传
2012-09-14 16:10 1656FROM: http://blog.sina.co ... -
js 彷excel 键盘上下左右移动
2012-09-03 19:11 3043思路假设初始坐标为(0,0)首先要算出表格的最大最小坐标 即( ... -
ruby Hash 总结
2012-08-31 18:51 63091. 如何创建Hash? x = Hash.newx = { ... -
ruby inject,循环计算优化
2012-08-27 16:51 1331From:http://blog.jayfields.com/ ... -
jquery 图表插件highcharts & highstock
2012-08-23 14:43 11203Highcharts是纯JavaScript编写的图表库,提 ... -
rails or ruby 中 fields_for 提交方式
2012-08-20 20:10 1637Project这个Model的new表单,我们需要在创建Pro ... -
Rails中导出excel的快速简便的方法
2012-07-31 15:51 1096controller def to_e ...
相关推荐
5. **回调**: 在模型的生命周期中可以定义各种回调函数,例如在保存之前或之后执行某些操作。 6. **自定义方法**: 可以在模型类中定义自定义的方法,实现特定的业务逻辑。 #### 五、高级用法 1. **分页**: 使用...
ActiveRecord支持在特定生命周期事件(如创建、更新、删除等)前后执行的回调函数。例如,`before_save :normalize_email`会在保存用户前自动规范化电子邮件地址。 8. **序列化** ActiveRecord允许你序列化复杂的...
允许保存记录而无需调用回调和验证。 正在安装 $ gem install sneaky-save 或放入您的gemfile以获取最新版本: gem 'sneaky-save' , git : 'git://github.com/einzige/sneaky-save.git' 使用 # Update. Returns ...
事务(基于异步钩子,因此您无需将代码包装到回调中) 基于knex.js(因此您拥有knex查询构建器的所有功能) 声明范围,关系,验证 Yaml夹具,用于播种测试数据并在测试中使用 级联保存 包含有限状态机 容易的多态...
在ActiveModel中,可以通过定义一个验证方法并在`validate`回调中调用来实现。下面是一个简单的示例: ```ruby class MyModel attr_accessor :input_array validate :intersection_validation private def ...
开发人员使用ActiveRecord所做的大部分工作都使数据模型对所有使用者都具有相同的功能(通过使用验证和回调),而Ecto鼓励使用不太严格的行为。 尽管可以在ActiveRecord中定义这些边界(请考虑 ),但是某些应用...
- **回调**:解释ActiveRecord中可用的生命周期回调,以及如何利用这些回调增强模型的功能。 - **迁移**:介绍如何使用迁移来管理和维护数据库结构的变化。 #### ActiveRecord迁移 - **迁移概述**:解释迁移的概念...
3. **回调(Callbacks)**:Ruby on Rails中的回调机制允许在对象生命周期的特定时刻执行代码,如在保存前(before_save)、保存后(after_save)或更新前(before_update)。回调常用于验证,例如在数据保存到...
但是,我们不想失去ActiveRecord的便利,例如验证,回调等。 用例示例是支持登录的模型: class SignIn < ActiveType :: Object # this is not backed by a db table attribute :username , :string ...
目标了解AR生命周期方法的概念使用before_save , before_create和before_validation 了解何时使用before_validation与before_save回呼现在,我们将ActiveRecord集成到Rails中,我们应该注意,只要模型中发生某些...
我们在这里介绍的所有内容都称为“活动记录生命周期回调”。 很多人都称它们为回调。 有点短。 看一下其中包含的博客应用程序。 在开始向Rails学习之前,请确保运行迁移(我们使用rake db:migrate做到了!)! ...
我们在这里介绍的所有内容都称为“活动记录生命周期回调”。很多人都称它们为回调。有点短。 看一下其中包含的博客应用程序。在开始向Rails学习之前,请确保运行迁移(我们使用rake db:migrate做到了!)!我们有一...
serialize_has_many 将has_many关系序列化为单个列,同时仍在进行属性,验证,回调,嵌套表单和fields_for。 使用ActiveRecord轻松实现NoSQL!安装将此行添加到您的应用程序的Gemfile中: gem 'serialize_has_many' ...
- **关联、验证及回调**:深入讲解ActiveRecord中的关联关系(如一对一、一对多等),以及如何进行数据验证和回调函数的应用。 - **ActionView表单**:学习如何在视图层构建动态表单,利用ActionView提供的模板...
Sequel Activemodel的结合使得在Sequel中可以使用ActiveRecord的一些特性,如验证、序列化和回调等,增强了Sequel的功能性和灵活性。 首先,我们来看看Sequel的核心概念。Sequel的核心是Dataset对象,它代表了...
OmniAuth 中间件会处理这个回调,解析出用户的标识符(通常称为 "uid")和其他信息,然后这些信息可以通过 `request.env['omniauth.auth']` 访问。 OmniAuth 还提供了丰富的自定义选项,比如可以在回调处理中添加...
5. **Callbacks**:回调机制,可以在特定事件(如`before_create`、`after_update`等)发生时执行代码。 6. **Typecasting**:类型转换,允许你指定属性的类型,如`attribute :age, type: Integer`,自动将字符串...
在2.3.3版中,ActiveRecord支持复杂的查询,如关联(associations)和回调(callbacks),以及ActiveRecord验证(validations)确保数据的完整性。 3. **ActionController**:处理HTTP请求并生成响应。在2.3.3中,...
3. `routes/web.php`:定义了相关的路由,如创建支付请求的路由和接收回调的路由。 通过这个项目,你可以了解到如何在实际的 Laravel 项目中将 Beyonic 集成进来,以及处理相关的支付流程。 总之,Laravel 与 ...
你可以学习如何定义属性、关系(如一对多、多对多)、验证和回调。 3. **控制器**:`app/controllers`目录下的文件是Rails应用的核心部分,它们处理HTTP请求并调用模型和视图。控制器类定义了各种行动,这些行动...