#ruby-on-rails #ruby #activerecord
#ruby-on-rails #ruby #activerecord
Вопрос:
Когда пользователь пытается создать запись с именем, которое уже существует, я хочу показать сообщение об ошибке типа:
name "some name" has already been taken
Я пытался сделать:
validates_uniqueness_of :name, :message => "#{name} has already been taken"
но при этом выводится имя таблицы вместо значения атрибута name
Ответ №1:
2 вещи:
- В сообщениях проверки используется интерполяция в стиле Rails I18n, которая
%{value}
- Ключевым является
value
, а неname
, потому что в контексте интернационализации остальная часть модели вас на самом деле не волнует.
Итак, ваш код должен быть:
validates_uniqueness_of :name, :message => '%{value} has already been taken'
Комментарии:
1. Приятно! Определенно чище, чем мой ответ.
2. Может быть полезно знать, что %{attribute} также доступен для использования.
Ответ №2:
Похоже, вы можете передать Proc
в сообщение. Когда вы делаете это, вы получаете два параметра:
- Символ в виде
:activerecord.errors.models.user.attributes.name.taken
- Хэш, который выглядит примерно так `{:модель=>»Пользователь», : атрибут =>»Имя», : значение => «Мое имя»}
Итак, если вы разрешаете два параметра в процедуре, вы можете использовать attributes[:value]
элемент, чтобы получить имя, которое использовалось:
validates_uniqueness_of :name,
:message => Proc.new { |error, attributes|
"#{attributes[:value]} has already been taken."
}
Ответ №3:
Какую версию Rails вы используете?
Если Rails 3. тогда, как я понимаю, вам следует использовать :message => '%{value} has already been taken'
. Я не уверен насчет Rails 2.3. — но в любом случае вы можете создать свою собственную пользовательскую проверку, которая выполняет то, что вам нужно.
Комментарии:
1. для этого приложения я использую rails 2.3.4