#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