как настроить сообщение об ошибке проверки активной записи rails для отображения значения атрибута

#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 вещи:

  1. В сообщениях проверки используется интерполяция в стиле Rails I18n, которая %{value}
  2. Ключевым является value , а не name , потому что в контексте интернационализации остальная часть модели вас на самом деле не волнует.

Итак, ваш код должен быть:

 validates_uniqueness_of :name, :message => '%{value} has already been taken'
  

Комментарии:

1. Приятно! Определенно чище, чем мой ответ.

2. Может быть полезно знать, что %{attribute} также доступен для использования.

Ответ №2:

Похоже, вы можете передать Proc в сообщение. Когда вы делаете это, вы получаете два параметра:

  1. Символ в виде :activerecord.errors.models.user.attributes.name.taken
  2. Хэш, который выглядит примерно так `{:модель=>»Пользователь», : атрибут =>»Имя», : значение => «Мое имя»}

Итак, если вы разрешаете два параметра в процедуре, вы можете использовать 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