Грамотные сообщения об ошибках валидации
Илья • 29 апреля 2007 г.
Представим что у нас есть модель User со следующими валидациями:
class User < ActiveRecord::Base
validates_presence_of :username
validates_presence_of :email
validates_presence_of :password
validates_length_of :password, :in => 6..12
attr_accessor :password
end
Самая обычная модель с самыми обычными валидациями. Вот только, если мы не заполним поле пароль, у нас сработают сразу две ошибки: пароль не может быть пустым и пароль слишком короткий. Абсурд: конечно пароль короткий, ведь его нет!
Решается всё элементарно: добавляем флаг :allow_nil => :true для валидации длины пароля:
class User < ActiveRecord::Base
validates_presence_of :username
validates_presence_of :email
validates_presence_of :password
validates_length_of :password, :in => 6..12, :allow_nil => true
attr_accessor :password
end
Теперь, если пользователь не введёт пароль, то сработает только валидация присутствия, а валидация на длину будет молчать как партизан.
Просто приятная мелочь, которая позволит сделать ваши сообщения об ошибках менее загруженными и абсурдными.
Update: Поправка опечатки.
5 комментариев:
Извините, но комментарии для этой статьи уже закрыты.

опечатка в тексте “добавляем флаг llow_nil => :true”
Ух ты, спасибо. Сам как-то не додумался.
может их как-то в цепочки объединять? первый заданный (в файле) – начало цепочки, последний заданный – конец
если один сработал, остальные и не проверяются..
Еще можно написать свой хелпер вместо error_messages_for, который будет выводить только одну ошибку (самую верхнюю/нижнюю из @object.errors). “Ошибочные” поля формы все равно будут выделены, а вид—аккуратнее. Конечно, если у каждого поля есть хинт, каким должно быть его содержание и наличествование.
Что-то не сработало у меня. Ибо при не заполнении поля передаётся params{:password => ””}. А в руби ”” != nil.
Может вы до этого что-то с params делали?