Проверка Rails 3 для группы полей

#ruby-on-rails #ruby-on-rails-3 #mongoid

#ruby-on-rails #ruby-on-rails-3 #mongoid

Вопрос:

У меня есть модель с целой кучей полей. Не все поля используются на основе выбора пользователем определенного типа формы. У меня есть около 6 различных типов форм, поэтому в 4 из них можно использовать поле.

Есть ли способ группировать проверку на основе элемента ie?

 case xxx
  when "form1"
    validates :field1, :presence => true
  when "form2"
    validates :field1, :presence => true
  when "form3"
    validates :fiel2, :presence => true
end
  

Я буду выполнять проверку на стороне клиента, но мне, очевидно, также понадобится серверная часть, чтобы убедиться, что они отправили правильные данные.

Есть предложения, как это можно сделать?

Я использую Rails3 с Mongoid 2.0

Заранее спасибо!

Ответ №1:

Что-то вроде этого?

 validates :field1, :presence => true, :if => Proc.new { |foo| %w{form1 form2}.include?(foo.xxx) }
validates :field2, :presence => true, :if => Proc.new { |foo| %w{form1 form3}.include?(foo.xxx) }
validates :field3, :presence => true, :if => Proc.new { |foo| %w{form2 form3}.include?(foo.xxx) }
  

Комментарии:

1. Это не сработает, потому что foo — это то, что проверяется. foo не знает, какая форма обрабатывается?

2. Извините, я предположил, что xxx будет методом в вашем классе модели. Поскольку это не так, измените этот бит на %w{form1 form2}.включить? (ххх). Может быть, реальный вопрос в том, откуда берется xxx? Я уже использовал class_attribute раньше, чтобы разрешить настройку модели на определенный режим, но не уверен, что это применимо в вашем случае.

Ответ №2:

Я вижу проблему с тем, что класс model должен обладать глубокими знаниями о задействованных представлениях. Если формы в представлениях были названы по-разному, решение не будет работать. Вы захотите использовать «группы проверки», подобные тем, которые используются в ASP.NET . Вы могли бы выполнить некоторый поиск по этому вопросу и либо найти аналогичное решение для Rails, либо создать свое собственное. Возможно, это поможет:https://github.com/akira/validationgroup