Связывание ошибки проверки с несколькими полями - PullRequest
2 голосов
/ 21 января 2011

Скажем, у меня есть одна проверка, которая работает с несколькими атрибутами. Например, я сохраняю «длину» определенной модели как два отдельных целых числа: футы,: дюймы, и я хочу убедиться, что длина не равна нулю, то есть оба: футы и: дюймы неотрицательны и по крайней мере один положительный. Это легко, например, добавив

errors.add_to_base('invalid length') unless (feet >= 0 and inches >= 0 and feet+inches > 0)

моему методу проверки (вместе с отдельными проверками целостности и дюймами <12). </p>

Но я хочу связать ошибку с полями :inches и :feet, чтобы при возникновении ошибки оба поля в форме выделялись. Прямо сейчас единственное, что я вижу, это звоню errors.add() дважды, по одному разу для каждого поля. Но я сгенерировал эту модель с использованием скаффолдинга, поэтому для этого потребуется выпустить два сообщения об ошибках, по одному на каждый вызов errors.add(). Также в самой форме я хотел бы использовать одну метку «Длина» рядом с обоими этими полями, и я хотел бы, чтобы эта метка выделялась при возникновении ошибки.

Нужно ли мне бросать строительные леса, чтобы добиться этого? Как? Спасибо!

Ответы [ 2 ]

3 голосов
/ 21 января 2011

Одним из способов справиться с этим является создание виртуального атрибута с именем «length» и установка ошибки для него, а не для полей компонента.Другими словами, создайте пользовательскую проверку, которая проверяет различные условия ошибки, создает строку (если имеется несколько ошибок) и затем добавляет строку к errors[:length].Форма должна будет отображать встроенные ошибки для атрибута длины в месте, где он визуально связан с полями "футы" и "дюймы".Очевидно, что для этого вам придется отказаться от строительных лесов.

В Railscasts эпизод 16 есть учебник по виртуальным атрибутам, который на данный момент немного устарел (2007!), Но все еще доступен для просмотра.Просто представьте, что это классический черно-белый фильм ...

0 голосов
/ 23 марта 2013

Вы можете установить ошибки для новой метки, а затем вложить метки в ваше представление. Это позволяет выделять каждое поле отдельно (отдельные сообщения об ошибках) или оба вместе (одно сообщение об ошибке).

В вашей модели вам не нужно создавать соответствующий виртуальный атрибут. Вы можете просто установить ошибки следующим образом:

errors.add(:length, 'invalid length'    ) unless (feet >= 0 && inches >= 0)
errors.add(:inches, 'too big'           ) unless (inches < 12)
errors.add(:feet,   'cannot be negative') unless (feet < 0)

Затем вложите метки в ваше представление:

- # (This is Haml.  If you use erb, I'm sure you can figure it out!)
= f.label :length do
  = f.label feet, "Feet:"
= f.text_field :feet

= f.label :length do
  = f.label inches, "Inches:"
= f.text_field :inches

Отказ от ответственности: я на самом деле не тестировал этот код, но у меня есть нечто очень похожее в моей базе кода Это с рельсами 3.1.11

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...