Подтвердить что ты не робот

Какая разница между "валидацией" и "проверкой"?

Предыстория:

Я использую Rails 3.2.13.

Я добавлял проверки на один из моих объектов, используя validate :field, presence: true. Когда я пошел на тестирование, я обнаружил, что на них не выдавались сообщения об ошибках. Я изменил их на validates и получил сообщения об ошибках. Этот билет имеет значение, это было какое-то время.

Я попытался добавить пользовательскую проверку с помощью validates и получил ошибку You need to supply at least one validation - изменил ее на validate, и все прошло, как ожидалось.

Вопросы:

Мое настоящее понимание заключается в использовании validates с "нормальными" проверками, но validate с пользовательскими. Это правильно? Есть ли еще какие-то предметы, о которых я должен знать? Есть ли в любом случае, чтобы первые проблемы терпели неудачу "громко", а не просто проверяли все?

Спасибо!

4b9b3361

Ответ 1

validates Этот метод является ярлыком для всех валидаторов по умолчанию и любых пользовательских классов валидатора, заканчивающихся в "Validator". Обратите внимание, что проверки подлинности по умолчанию Rails можно переопределить внутри определенных классов, создав на их основе специальные классы валидатора, такие как PresenceValidator.

validates :title, :body, :presence => true

validate, добавляет метод проверки или блокирует класс. Это полезно, когда переопределение метода экземпляра проверки становится слишком громоздким, и вы ищете более описательное объявление о своих проверках.

validate :must_be_friends

  def must_be_friends
    errors.add(:base, 'Must be friends to leave a comment') unless commenter.friend_of?(commentee)
  end

Ответ 2

Я считаю, что объявление :validate используется для персонализированной проверки, где :validates используется для общей проверки, например presence, uniqueness etc в поле

Метод validate ищет метод с именем параметра, т.е.  если вы выполните validate :field, он будет искать

def field 

end

на object. Поскольку Rails определяет attr_accessor для каждой базы данных field, validate :field будет вызывать метод чтения field.

Если функция проверки возвращает true или если существует объект error, т.е. object.errors не пуст, то объект считается valid?

Следовательно, причина в ligthouse проблема, они жалуются, что validate silently bypasses проверка:)

Надеюсь, что это имеет смысл