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