在一个应用程序中,我有三种类型的联系人表单--在模型中--属性:aaa, :bbb, :ccc属于第二种联系人形式,而前面的属性属于第一种联系人形式。
class Message
include ActiveModel::Validations
include ActiveModel::Conversion
extend ActiveModel::Naming
attr_accessor :name, :email, :body, :aaa, :bbb, :ccc
validates :name, :email, :body, :aaa, :bbb, :ccc, :presence => true
validates :email, :format => { :with => %r{.+@.+\..+} }, :allow_blank => true
def initialize(attributes = {})
attributes.each do |name, value|
send("#{name}=", value)
end
end
def persisted?
false
end
end我想要做的是:我正在寻找一种方法,如何验证各个联系人表单的属性,具体而言:
:name, :email, :body,我需要对其进行验证:aaa, :bbb, :ccc, :email,我需要对其进行验证怎么做?如何区分哪些属性,哪些属性属于哪一种形式并进行验证?
发布于 2013-01-30 22:29:15
如果有三种类型的合同表格,为什么不把它们分成三个单独的类呢?如果对于某些擦除,您仍然希望将其保存在一个类中,则可以使用“with_options”魔术来完成它:
with_options :if => :is_form_1? do |p|
p.validates_presence_of :attr1
p.validates_presence_of :attr2
p.validates_presence_of :attr3
end
with_options :if => :is_form_2? do |p|
p.validates_presence_of :attr4
p.validates_presence_of :attr5
p.validates_presence_of :attr6
end
def is_form_1?
#some logic
end
def is_form_2?
#some logic
end尽管如此,我还是不喜欢把它放在一节课上。
发布于 2013-01-30 22:39:41
我建议你从行为而不是实施的角度来考虑这个问题。你提到有三种联系方式,但是你把每一种形式的潜在用途是什么呢?当你建立你的模型时,你不应该考虑表单。
已经说过了,您可以使用范围宝石实现您想要的结果。使用validation_scopes,您可以定义一组可以独立处理的验证规则。在控制器中,您可以检查适用于上下文的验证规则集(即用户填写的表单)。
在您的模型中,您可以设置为每个表单命名的验证作用域(或者更好的方法是以具有语义价值的方式命名上下文,但我对应用程序的了解还不足以知道上下文是什么),如下所示:
validation_scope :form_one_errors do |vs|
validates :name, :body, :presence => true
end
validation_scope :form_two_errors do |vs|
validates :aaa, :bbb, :ccc, :presence => true
end由于电子邮件需要在这两种情况下进行验证,所以您可以将其设置为正常的验证(按照问题中的代码)。
然后,在form one控制器中,您可以检查作用域,以查看该上下文是否有任何错误。请注意,对于常规的验证错误,您必须单独检查验证作用域的错误。
if !message.valid?
# Do something with message.errors
elsif message.has_form_one_errors?
# Do something with message.form_one_errors
else
# All good
endhttps://stackoverflow.com/questions/14614886
复制相似问题