如何验证提交ActiveRecord的单个属性而不是所有属性?

问题描述:

我正在使用Ruby on Rails 3,我想验证提交ActiveRecord的单个属性,而不是所有属性。如何验证提交ActiveRecord的单个属性而不是所有属性?

例如,在我的模型,我有:

validates :firstname, :presence => true, ... 
validates :lastname, :presence => true, ... 

我想对:firstname并在:lastname分别运行验证。 这可能吗?如果是这样,我该如何做到这一点?


P.S:我知道,是为了进行验证有像“validates_presence_of”,“validates_confirmation_of” ...的方法,但我想只使用上面的代码。

+2

这个截屏你是什么意思'separately'?会有2个电话来保存例如,还是只有一个?你想要做什么的用例/场景是什么? – Zabba 2011-03-20 10:55:17

你可以设置你的模型虚拟属性,然后根据该属性进行条件验证。

你可以找到http://railscasts.com/episodes/41-conditional-validations

+0

伟大的解决方案! – fl00r 2011-03-20 15:45:32

你可以删除你的代码的第二线之上,所以它读取:名字:

validates :firstname, :presence => true 

没有确认将被上进行。

问候

罗宾

+0

我想验证':firstname'和(然后)分别验证':lastname',所以我需要第二部分。 – user502052 2011-03-20 08:53:09

class Model < ActiveRecord::Base 
    def save(*attrs) 
    Model.validates :firstname, :presence => true if attrs.empty? || attrs.include?(:firstname) 
    Model.validates :lastname, :presence => true if attrs.empty? || attrs.include?(:lastname) 
    ... 
    super 
    end 
end 

m = Model.new 
m.save 
#=> false 
m.save(nil) # same as save(false), you can use both of them 
#=> true 
m = Model.new :firstname => "Putty" 
m.save 
#=> false 
m.save(:firstname, :lastname) 
#=> false 
m.save(:firstname) 
#=> true 
+0

不错。但是,这不会覆盖'ActiveRecord :: Validations'中的'save(options = {})'方法,因此'save(false)'将不再起作用吗?不确定这一点,但也许你已经考虑到了这一点? – Zabba 2011-03-20 11:00:13

+0

@Zabba,好点,但实际上'save(false)'会忽略所有验证,因为attrs不会是空的,并且没有任何名称为'false'的列名。但是 - 是的 - 它很hacky,我们可以简单地重构此方法:) – fl00r 2011-03-20 11:08:30