Условные проверки в Ruby при использовании ActiveSupport

Я довольно новичок в 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

... но "validates" выдает ошибку, когда помещается внутри метода.

Мне также понравилась идея иметь два отдельных файла сценария проверки, которые включаются в мою модель формы, но так как процесс выполняется с простым ".valid?" Метод, я не уверен, как отличить сценарии на этом уровне.

Есть ли способ переключения между двумя (или более) наборами проверок с использованием одной модели?

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 и библиотеки реформ делают это легко.

Другие вопросы по тегам