2012-07-29 46 views
0

我目前正在研究一个Rails 3应用程序,该应用程序具有一个窗体,该窗体将一个父对象与从相当大的数组中选择的几个预定义属性进行比较。每个父对象都有几个子对象,这些对象取决于您在父对象中选择了哪些预定义的属性,可以具有WILDLY不同的最小 - 最大值,每个值都有自己独立的常见唯一限制。Rails 3极大模型验证

我很快意识到验证这些对象将导致一个非常大的模型文件。我想知道是否有合适的方法从模型中删除这种大规模验证(或者至少让模型指向其他地方)。

此外,还有一个更高层次的问题,是否有正常的说法...... 1000行代码来验证对象数据的完整性?

+1

绝对不是“正常”,在您的模型中有1000行验证代码。 – Dty 2012-07-29 01:44:32

+0

嗯,我猜正常不是正确的术语。一个更好的术语是合理的。我知道大多数情况下,你可以使用助手方法,也可以使用1个自定义助手(比如验证电子邮件地址)几行。然而,我正在处理的有很多小细节,根据您选择的内容而有所不同。因此,为了捕捉每一个小小的情况,代码似乎很快就会膨胀起来。因此,我试图将其移出模型。 – user1560348 2012-07-29 04:22:49

回答

2

1)您可以创建自定义的验证器类,其中包括加载ActiveModel从::验证inheirting和实现一个validate方法,它记录验证:

class Report > ActiveRecord::Base 
    validates with MyValidator 
end 

class MyValidator < ActiveModel::Validator 
def validate(record) 
    record.errors[:base] = << "Error" unless is_valid(record) 
    end 
end 

2)在Rails 3,有验证宏,这意味着扩展ActiveModel :: EachValidator:

class Report < ActiveRecord::Base 
    validates :name :report_like => true 
end 

class ReportLikeValidator < ActiveModel::EachValidator 
    def validate_each(record, attribute, value) 
    unless value["Report"] 
     record.errors.add attribute, "Does not appear to be a ..." 
    end 
end 
+0

对于这些自定义验证器类,我应该将它们放在我的rails应用程序中?我读过的一些地方推荐使用lib目录,但只有将代码放入模型中,即使我的简单验证工作正常。 – user1560348 2012-07-29 04:25:14

+0

看看这篇文章:http://my.rails-royce.org/2010/07/21/email-validation-in-ruby-on-rails-without-regexp/ – JohnMerlino 2012-07-29 04:27:11