Представим что у нас есть модель 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 комментариев:

  1. Ivan Nemytchenko:

    опечатка в тексте “добавляем флаг llow_nil => :true”

  2. Dmytro Shteflyuk:

    Ух ты, спасибо. Сам как-то не додумался.

  3. mholub:

    может их как-то в цепочки объединять? первый заданный (в файле) – начало цепочки, последний заданный – конец

    если один сработал, остальные и не проверяются..

  4. Andrey Andreev:

    Еще можно написать свой хелпер вместо error_messages_for, который будет выводить только одну ошибку (самую верхнюю/нижнюю из @object.errors). “Ошибочные” поля формы все равно будут выделены, а вид—аккуратнее. Конечно, если у каждого поля есть хинт, каким должно быть его содержание и наличествование.

  5. Gregory:

    Что-то не сработало у меня. Ибо при не заполнении поля передаётся params{:password => ””}. А в руби ”” != nil.

    Может вы до этого что-то с params делали?

Извините, но комментарии для этой статьи уже закрыты.