2012-01-24 6 views
2

Я внедрил проверки зависимым образом, например, если формат 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

Я просто столкнулся с подобной проблемой; это то, как я установил его с помощью 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 

Working (используя 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. метод проверки теперь возвращает ложь при сбое
  3. validate validate_max_entries_for_discipline становится before_save validate_max_entries_for_discipline!

 Смежные вопросы

  • Нет связанных вопросов^_^