Изменить приоритет пользовательских проверок в модели рельсов - PullRequest
2 голосов
/ 24 января 2012

Я реализовал валидации зависимым образом, например, если формат start_date недопустим, поэтому я не хочу запускать другую валидацию для start_date.

 validates_format_of :available_start_date, :with =>  /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}((((\-|\+){1}\d{2}:\d{2}){1})|(z{1}|Z{1}))$/, :message => "must be in the following format: 2011-08-25T00:00:00-04:00"

Это проверяет определенный формат, а затем у меня есть пользовательские методы проверки, вызываемые из которых должны выполняться позже.

def validate
  super
  check_offer_dates
end

Я использовал self.errors ["start_date"], чтобы проверить, содержит ли объект ошибки ошибки, он должен пропустить другие проверки того же параметра, если он не пустой.

Но проблема в том, что def validate сначала вызывается, а затем validates_format_of. Как я могу изменить это так, чтобы поток мог быть достигнут.

1 Ответ

1 голос
/ 11 июля 2013

Я только что столкнулся с подобной проблемой;вот как я это исправил, используя before_save выноску:

Не работает (проверяет в неправильном порядке - я хочу, чтобы пользовательская проверка была последней):

class Entry < ActiveRecord::Base
   validates_uniqueness_of :event_id, :within => :student_id
   validate :validate_max_entries_for_discipline

   def validate_max_entries_for_discipline
      # set validation_failed based on my criteria - you'd have your regex test here
      if validation_failed
         errors.add(:maximum_entries, "Too many entries here")
      end
   end
end

Работает (с использованием выноски before_save):

class Entry < ActiveRecord::Base
   before_save :validate_max_entries_for_discipline!
   validates_uniqueness_of :event_id, :within => :student_id

   def validate_max_entries_for_discipline!
      # set validation_failed based on my criteria - you'd have your regex test here
      if validation_failed
         errors.add(:maximum_entries, "Too many entries here")
         return false
      end
   end
end

Обратите внимание на изменения:

  1. validate_max_entries_for_discipline становится validate_max_entries_for_discipline!
  2. методом проверки сейчасвозвращает false при ошибке
  3. validate validate_max_entries_for_discipline становится before_save validate_max_entries_for_discipline!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...