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

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

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

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.

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


person Lee    schedule 18.05.2011    source источник


Ответы (2)


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

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) }
person MacksMind    schedule 18.05.2011
comment
Это не сработает, потому что проверяется foo. foo не знает, какая форма обрабатывается? - person Lee; 18.05.2011
comment
Извините, я предполагал, что xxx будет методом в вашем классе модели. Поскольку это не так, измените этот бит на %w{form1 form2}.include?(xxx). Может быть, настоящий вопрос заключается в том, откуда берется xxx? Раньше я использовал class_attribute, чтобы разрешить установку модели в определенный режим, но не уверен, что это применимо в вашем случае. - person MacksMind; 18.05.2011

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

person Steve Hong    schedule 28.10.2011