0

在一个应用程序中,我有 3 种联系表格 - 在模型中 - 属性: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,我需要验证

怎么做?如何区分,哪些属性属于哪个表单并验证它们?

4

2 回答 2

0

如果有 3 种类型的合同表格,为什么不将它们分成 3 个单独的类别?如果您仍然想将其保留在一个班级中,则可以使用“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-30T22:29:15.860 回答
0

我建议您从行为而不是实施方面考虑这一点。您提到有三种联系表格,但是您将每张表格用于的潜在用途是什么?在设置模型时,您不应该考虑表单。

话虽如此,您可以使用validation_scopes gem实现您想要的。使用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

由于电子邮件需要在两种情况下进行验证,您可以将其设置为正常验证(根据您在问题中的代码)。

然后在控制器中,比如说,表格一,您可以检查范围以查看该上下文是否有任何错误。请注意,对于常规验证错误,您必须单独检查验证范围的错误。

if !message.valid?
  # Do something with message.errors
elsif message.has_form_one_errors?
  # Do something with message.form_one_errors
else 
  # All good
end
于 2013-01-30T22:39:41.863 回答