首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails -一个模型,两种验证规则。

Rails -一个模型,两种验证规则。
EN

Stack Overflow用户
提问于 2013-01-30 22:16:19
回答 2查看 179关注 0票数 0

在一个应用程序中,我有三种类型的联系人表单--在模型中--属性:aaa, :bbb, :ccc属于第二种联系人形式,而前面的属性属于第一种联系人形式。

代码语言:javascript
复制
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,我需要对其进行验证

怎么做?如何区分哪些属性,哪些属性属于哪一种形式并进行验证?

EN

回答 2

Stack Overflow用户

发布于 2013-01-30 22:29:15

如果有三种类型的合同表格,为什么不把它们分成三个单独的类呢?如果对于某些擦除,您仍然希望将其保存在一个类中,则可以使用“with_options”魔术来完成它:

代码语言:javascript
复制
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

尽管如此,我还是不喜欢把它放在一节课上。

票数 0
EN

Stack Overflow用户

发布于 2013-01-30 22:39:41

我建议你从行为而不是实施的角度来考虑这个问题。你提到有三种联系方式,但是你把每一种形式的潜在用途是什么呢?当你建立你的模型时,你不应该考虑表单。

已经说过了,您可以使用范围宝石实现您想要的结果。使用validation_scopes,您可以定义一组可以独立处理的验证规则。在控制器中,您可以检查适用于上下文的验证规则集(即用户填写的表单)。

在您的模型中,您可以设置为每个表单命名的验证作用域(或者更好的方法是以具有语义价值的方式命名上下文,但我对应用程序的了解还不足以知道上下文是什么),如下所示:

代码语言:javascript
复制
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控制器中,您可以检查作用域,以查看该上下文是否有任何错误。请注意,对于常规的验证错误,您必须单独检查验证作用域的错误。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14614886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档