使用ActiveSupport时,Ruby中的条件验证

时间:2016-04-21 00:30:47

标签: ruby-on-rails ruby validation activesupport activesupport-concern

我对Ruby很新,所以我希望我错过了一些明显的东西。我有一个表单的应用程序,使用类似的东西进行验证...

module FormValidations
  extend ActiveSupport::Concern
  included do

    validates :field_1, :if => lambda { self.stage == APPLICATION_STAGE[:DATA_ENTRY] }
    validates :field_2, :if => lambda { self.stage == APPLICATION_STAGE[:DATA_ENTRY] }
    validate :field_sec, :if => lambda { self.stage == APPLICATION_STAGE[:DATA_ENTRY] }

    def field_sec
      (*some custom stuff*)
    end

......依此类推,效果很好。

我现在有一种新类型的表单,它使用相同的模型和数据库结构,但有一些设置为不同的东西。它还经历了完全不同的验证过程。我一直试图找到一种方法,所以让验证调用成为有条件的,比如......

included do

  validate :form_switch, :if => lambda { self.stage == APPLICATION_STAGE[:DATA_ENTRY] }

  def form_switch
    #This uses a method I defined in the model to tell which form is active
    if is_special_form == true
      validates :field_245, :if => lambda { self.stage == APPLICATION_STAGE[:DATA_ENTRY] }
      validates :field_432, :if => lambda { self.stage == APPLICATION_STAGE[:DATA_ENTRY] }
    else
      validates :field_1, :if => lambda { self.stage == APPLICATION_STAGE[:DATA_ENTRY] }
      validates :field_2, :if => lambda { self.stage == APPLICATION_STAGE[:DATA_ENTRY] }
    end
  end

...但是"验证"放置在方法内部时抛出错误。

我还想到了将两个单独的验证脚本文件包含在我的表单模型中的想法,但由于该过程是使用简单的" .valid?"方法,我不知道如何区分该级别的脚本。

有没有办法使用单一模型在两组(或多组)验证之间切换?

1 个答案:

答案 0 :(得分:1)

您可以有条件地进行所有验证。我认为没有必要把所有东西都塞得这么深。由于包含块的内容将在模型类的上下文中执行,因此应该可以:

included do
  validates :field_245, :if => :validate_field_245?
  validates :field_432, :if => :validate_field_432?
  validates :field_1, :if => :validate_field_1?
  validates :field_2, :if => :validate_field_2?

  def validate_field_245?
    is_special_form && stage == APPLICATION_STAGE[:DATA_ENTRY]
  end

  def validate_field_432?
    is_special_form && stage == APPLICATION_STAGE[:DATA_ENTRY]
  end

  def validate_field_1?
    !is_special_form && stage == APPLICATION_STAGE[:DATA_ENTRY]
  end

  def validate_field_2?
    !is_special_form && stage == APPLICATION_STAGE[:DATA_ENTRY]
  end
end

一旦您发现自己有条件地使用不同的验证,就应该考虑using form objects来处理验证逻辑。 simple_formreform库可以轻松实现。