Как я могу объединить несколько проверок Rails для одного и того же: если условие? - PullRequest
4 голосов
/ 07 апреля 2011

У меня есть модель с множеством проверок, которые могут быть сгруппированы на основе различных условий. Грубая сила способ справиться с этим будет:

validates_presence_of :attr1, :if => :condition1
validates_something :attr2, :if => :condition1
validates_something_else :attr3, :if => :condition1
...

validates_presence_of :attr4, :if => :condition2
validates_something :attr5, :if => :condition2
validates_presence_of :attr6, :if => :condition2
...

Но это не похоже на СУХОЙ. Есть ли хороший способ сгруппировать проверки на основе условий? Подход, который я придумал:

class Condition1Validator < ActiveModel::Validator
  def validate(record)
    record.instance_eval do
      validates_presence_of :attr1
      validates_something, :attr2
      validates_something_else :attr3
    end
  end
end
validates_with Condition1Validator, :if => :condition1

class Condition2Validator < ActiveModel::Validator
...
end
validates_with Condition2Validator, :if => :condition2

Кто-нибудь может придумать лучший способ?

Обновление: способ, который я опубликовал выше, имеет недостатки: вы не можете использовать if, если и т. Д. На вложенных валидаторах. Решение Джесси намного лучше.

1 Ответ

11 голосов
/ 07 апреля 2011

Этот подход основан на многошаговом мастере, в котором вы хотите проверить, только если вы находитесь на этом шаге мастера.Должно работать и для вас

class YourModel 

  with_options :if => lambda { |o| o.whatever == "whatever" } do |on_condition|
    on_condition.validates_presence_of :address
    on_condition.validates_presence_of :city
  end

  with_options :if => lambda { |o| o.condition_the_second == "whatever" } do |on_condition|
    on_condition.validates_presence_of :foo
    on_condition.validates_presence_of :bar
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...