Rails I18n: Как добавить ключ перевода ошибок, общий для всех ошибок базы модели?

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

@user.errors.add(:base, :common_error)
@post.errors.add(:base, :common_error)
..and so on

Я действительно беспокоюсь, что если я должен добавить ключ :common_error во все модели, так как в приложении присутствует больше моделей.

Мой текущий файл en.yml выглядит следующим образом:

en-uk:
  activerecord:
    errors:
      <<: *errors
        models:
          user:
            attributes:
              base:
                some_key: ""
          post:
            attributes:
              base:
                some_key: ""

Я не уверен, что есть простое решение, которого я не нашел. Но любые идеи будут оценены. Заранее спасибо!


person Venkat Ch    schedule 07.07.2015    source источник


Ответы (2)


Просто не используйте относительный ключ перевода -

@user.errors.add(:base, t(:common_error) )

Если вы передаете символ в errors.add, перевод использует область действия модели.

person Andrew Porter    schedule 07.07.2015
comment
Хотя моя работа выполнена. Интересно, есть ли какое-либо решение, использующее относительные ключи перевода, как я объяснил в своем вопросе :) - person Venkat Ch; 08.07.2015
comment
Возможно, вы сможете использовать архивы узлов в файле yaml. Тогда у вас будет ссылка на запись user:/attributes:/base: каждой модели вместо явной строки. - person Andrew Porter; 08.07.2015
comment
Я пытаюсь понять привязки узлов здесь. У вас есть простой пример, который вы могли бы привести? - person Venkat Ch; 09.07.2015

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

en:
  errors:
    messages:
      common_error: 'is common'

Это относится как к моделям Active Record, так и к моделям Active Model. Если вы хотите, чтобы он применялся только к одному или другому, вы можете вместо этого вложить errors под activerecord или activemodel следующим образом:

en:
  activemodel:
    errors:
      messages:
        common_error: 'is common'
person Tyler Hunt    schedule 08.02.2019