Какая разница между "валидацией" и "проверкой"?
Предыстория:
Я использую Rails 3.2.13.
Я добавлял проверки на один из моих объектов, используя validate :field, presence: true
. Когда я пошел на тестирование, я обнаружил, что на них не выдавались сообщения об ошибках. Я изменил их на validates
и получил сообщения об ошибках. Этот билет имеет значение, это было какое-то время.
Я попытался добавить пользовательскую проверку с помощью validates
и получил ошибку You need to supply at least one validation
- изменил ее на validate
, и все прошло, как ожидалось.
Вопросы:
Мое настоящее понимание заключается в использовании validates
с "нормальными" проверками, но validate
с пользовательскими. Это правильно? Есть ли еще какие-то предметы, о которых я должен знать? Есть ли в любом случае, чтобы первые проблемы терпели неудачу "громко", а не просто проверяли все?
Спасибо!
Ответы
Ответ 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
проверка:)
Надеюсь, что это имеет смысл