В чем разница между валидацией и валидацией?

Я добавил проверку объектов, используя:

validate :field, presence: true

Я обнаружил, что они не выдают сообщений об ошибках. Я изменил их на validates и получил сообщения об ошибках. Этот билет актуален.

Я попытался добавить пользовательскую проверку с помощью validates и получил ошибку:

You need to supply at least one validation

Я изменил его на validate, и все прошло, как и ожидалось.

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


person Lucy Bain    schedule 09.08.2013    source источник
comment
возможно, один из них представляет собой пользовательский синтаксис проверки validate, а другой - общий синтаксис проверки validates.   -  person Viren    schedule 09.08.2013
comment
@Viren - мне просто интересно, не пропустил ли я что-нибудь еще. Я не смог найти четкое объяснение этих двух, и я надеюсь, что SO сможет предоставить. Я согласен, это единственное отличие, которое я нашел до сих пор.   -  person Lucy Bain    schedule 09.08.2013
comment
Я ответил на него, не забывая о маяке :)   -  person Viren    schedule 09.08.2013


Ответы (2)


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

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

validate, добавляет в класс метод проверки или блок. Это полезно, когда переопределение метода экземпляра 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
person rmagnum2002    schedule 09.08.2013
comment
из curiosity какого документа вы можете прикрепить ссылку, а также проверили ли вы его, насколько мне известно, он не работает - person Viren; 09.08.2013
comment
пересмотрел мой ответ :) этот: apidock.com/rails/ActiveModel/Validations/ClassMethods/ Я прочитал приведенные ниже примеры и понял именно это, но, похоже, ошибся. Более описательные api.rubyonrails.org/classes/ActiveModel/Validations/ - person rmagnum2002; 09.08.2013
comment
О, я не знал о пользовательских классах валидаторов, оканчивающихся на «валидатор», это действительно полезно знать. Я оставлю вопрос открытым немного дольше на случай, если появятся другие ответы, но я вернусь позже, чтобы принять его. Спасибо за объяснение! - person Lucy Bain; 09.08.2013
comment
проверяет ли приведенный выше код, если комментатор принадлежит комментатору? - person Jwan622; 29.01.2015

Я считаю, что объявление :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 валидация :)

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

person Viren    schedule 09.08.2013
comment
Ах, спасибо за это объяснение! Я не думал об этом таким образом, но это полностью имеет смысл. Это также объясняет, почему :validate нельзя было громко сломать, поскольку это вполне разумный (можно даже сказать, действительный...) вызов. Я не думал об этом так. - person Lucy Bain; 09.08.2013
comment
Это чрезвычайно важно. Серьезно неожиданные результаты находятся всего в одном символе. Спасибо за публикацию не только полученной информации, но и науки, стоящей за ней. Ваше здоровье! - person Joshua Pinter; 19.08.2015
comment
Rails API сбивает с толку в этом отношении — молчаливый сбой методов проверки проблематичен, особенно если они не обнаружены тестами. - person BKSpurgeon; 03.02.2020