2012-03-27 3 views
9

У меня есть поле строки foo, которые должны отвечать четырем условиям:валидация Несколько форматов в Rails

  • Оно должно быть не пустым
  • Оно должно быть уникальным для всех записей
  • Оно должно содержать только буквы , цифры и hypens
  • Он не должен начинаться со строки «бар»

Первые два обрабатываются :presence и :uniqueness валидации. Последние два легко обрабатываются валидациями с помощью регулярных выражений :format.

Можно ли включить несколько правил проверки достоверности :format с различными значениями :message?

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

В идеале я хотел бы, чтобы все это было обернуто в одном звонке validates, но это не обязательно.

ответ

17

Согласно source code for the validates method, нет никакого способа сделать это; вы получаете один ключ :format и один набор опций в качестве значения хэша.

Тем не менее, ничто не мешает мне от вызова validates дважды:

validates :foo, 
    :presence => true, 
    :uniqueness => true, 
    :format => { 
    :with => /^[\w\-]*$/, 
    :message => 'may only contain letters, digits, and hyphen' 
    } 
validates :foo, :format => { 
    :with => /^(?!bar)/, 
    :message => 'may not start with "bar"' 
} 

Это, кажется, работает хорошо.

1

Один валидатор может вставить несколько атрибутов, как Validator#validate source code. Таким образом, можно более чистить, как показано ниже:

validates :foo, 
    :presence => true, 
    :uniqueness => true, 
    :format => {`enter code here` 
    :with => /^[\w\-]*$/, 
    :message => 'may only contain letters, digits, and hyphen' 
    }, 
    :format => { 
    :with => /^(?!bar)/, 
    :message => 'may not start with "bar"' 
    } 
} 
Смежные вопросы