0

我对 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?”执行的。方法,我也不确定如何区分该级别的脚本。

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

4

1 回答 1

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

一旦您看到自己有条件地使用不同的验证,是时候考虑使用表单对象来处理验证逻辑了。simple_form改革库使它变得容易。

于 2016-04-21T04:07:16.180 回答