errors.full_messages: имя атрибута появляется дважды - PullRequest
4 голосов
/ 25 января 2011

Это меня давно беспокоило. Эта проблема возникает со всеми моими моделями, но я буду использовать одну из них, Quiz, в качестве примера.

Тест имеет следующие проверки:

validates_presence_of :size, :style

Я использую I18n, и у меня есть следующий набор в моем файле переводов: (это просто стандартные сообщения об ошибках, но я включил их в свой en.yml, чтобы было легко увидеть структуру, если я хочу переопределить их для любой конкретной модели)

activerecord:
  errors:
    messages:
      inclusion: "{{attribute}} is not included in the list"
      invalid: "{{attribute}} is invalid"
      empty: "{{attribute}} can't be empty"
      blank: "{{attribute}} can't be blank"
      record_invalid: "Validation failed: {{errors}}"   

Проблема заключается в следующем: если я сделаю новую викторину, которая не пройдет валидацию, посмотрите на quiz.errors.full_messages, каждое сообщение об ошибке имеет атрибут, а затем полное сообщение:

>> quiz = Quiz.create
=> <unsaved quiz object>
>> quiz.errors.full_messages
=> ["Size Size can't be blank", "Style Style can't be blank"]

Я не понимаю, почему сообщение, например, "Size Size can't be blank", а не "Size can't be blank"

Есть идеи у кого-нибудь?

Ответы [ 2 ]

8 голосов
/ 25 января 2011

Там должно быть также:

en:
  errors:
    # The default format to use in full error messages.
    format: "%{attribute} %{message}"

И другие ваши переводы не должны включать %{attribute} больше. Чтобы убедиться, что все правильно, используйте en.yml из вашей версии Rails, он расположен по адресу: lib/ruby/gems/1.8/gems/activemodel-3.0.3/lib/active_model/locale/en.yml

5 голосов
/ 25 января 2011

Я только что понял это и подумал, что сам отвечу на случай, если у кого-то возникнет такая проблема: мне нужно было исправить часть activerecord моего файла переводов следующим образом:

activerecord:
  errors:
    full_messages:
      format: "{{message}}"    
    #define standard error messages, which we can overide on per model/per attribute basis further down
    messages:
      inclusion: "{{attribute}} is not included in the list"
      exclusion: "{{attribute}} is reserved"

Проблема заключалась в том, что ключ activerecord.errors.full_messages.format был установлен (в vendor/rails/activerecord/lib/active_record/locale/en.yml) на "{{attribute}} {{message}}", а сообщения в свою очередь были на "{{attribute}} can ' например, пустым. Таким образом, full_message получилось как "{{attribute}} {{attribute}} не может быть пустым". Если изменить его на «{{message}}», то это исправлено.

...