0

Я довольно новичок в Ruby, поэтому я надеюсь, что просто пропустил что-то очевидное. У меня есть приложение с формой, которая проходит через проверку, используя что-то вроде этого ...Условные проверки в Ruby при использовании ActiveSupport

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

Вы можете сделать все проверки условными. Я не думаю, что нужно так глубоко вложить все это. Поскольку содержимые включенный блок будет выполняться в контексте вашей модели класса, это должно работать:

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_form и reform библиотеки упрощают работу.

+0

Хорошая идея. В то же время я мог бы упростить его, сделав два метода (специальные и специальные) вместо многих, так как контент не зависит от какой-либо конкретной области. Я опубликую больше после того, как попробую. – ThisLanham

 Смежные вопросы

  • Нет связанных вопросов^_^