Подтвердить что ты не робот

Ruby on Rails i18n - Хотите перевести пользовательские сообщения в моделях

У меня есть атрибуты со специальной проверкой, где я использую предложение сообщения для отображения специального сообщения только для этой проверки. Вот один пример:

validates :email, presence:   true, length: { maximum: 60 },
                format:     { with: valid_email_regex, message: "is not a valid email address format." },
                uniqueness: { case_sensitive: false } 

Я хотел бы перевести здесь сообщение, но я не уверен, как это сделать.

Я видел примеры, где они печатают что-то вроде этого: message: t ( "some_value_here" ). Я не уверен в назначении. Я пробовал что-то вроде этого сообщения: t (: bad_email). Я сделал следующее в файле yaml, чтобы что-то попробовать.

activemodel:
  errors:
    bad_email: "is not a valid email address format."

Когда я попытался получить доступ к моему Rails-приложению, я получил следующую ошибку:

ActionView::Template::Error (undefined method `t' for #<Class:0x007fefc1b709e0>)

Я также пробовал это в своем файле yaml:

activemodel:
  errors:
    user:
      bad_email: "is not a valid email address format."

Я изучаю это и весь день. Все, что я могу найти, это заменить встроенные хэши-ошибки как пустые или пустые. Есть ли способ для меня иметь пользовательские хэши ошибок и заменить их в модели? На данный момент я не могу заставить t работать как закодированный. Я надеюсь, что проблема в том, как я установил файл yaml. Я видел различные варианты того, как это установить. Я не уверен, должен ли я включить это под activemodel или activerecord. Я предположил, что activemodel, поскольку это то, где пользовательское сообщение - это то, что я хочу перевести.

Любая помощь будет оценена по достоинству. Это последняя часть, которую мне нужно выяснить, прежде чем запускать мой первый перевод приложения.

ОБНОВЛЕНИЕ 7/29/2013 7:30 вечера CDT

bgates дал мне очень хорошее начало, как настроить файлы модели для получения пользовательского сообщения в файле YAML. Однако мне пришлось выполнить следующую настройку в моем файле yaml для получения настраиваемых сообщений.

activerecord:
  errors: 
    models: 
      user: 
        attributes: 
          bio: 
            no_links: "cannot contain email addresses or website links (URLs)."
          email: 
            bad_email: "is not a valid email address format."
          username: 
            bad_username: "can only contain numbers and letters.  No special characters or spaces."
4b9b3361

Ответ 1

Используйте символ для сообщения:

validates :email, presence:   true, length: { maximum: 60 },
            format:     { with: valid_email_regex, message: :bad_email },
            uniqueness: { case_sensitive: false } 

то в файле yaml

[lang]:
  activerecord:
    errors:
      messages:
        bad_email: "just ain't right"

Если есть перевод, специфичный для этой модели, он переопределит общий выше:

[lang]:
  activerecord:
    errors:
      models:
        model_name: # or namespace/model_name
          attributes:
            email:
              bad_email: "model-specific message for invalid email"

Если вы пишете специальные проверки, add_error(:email, :bad_email) выполнит поиск выше, но errors[:email] << :bad_email не будет.

Ответ 2

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

Пользовательская проверка с сообщением i18n:

validate :something_custom?, if: :some_trigger_condition

def something_custom?
  if some_error_condition
    errors.add(:some_field_key, :some_custom_msg)
  end
end

# en.yml
activerecord: 
  errors:
    models:
      some_model:
        some_custom_msg: "This is i18n controlled. yay!"

Ответ 3

Решение этого не должно быть обычным; Сообщение валидатора format уже сопоставляется с символом :invalid. Вам нужно установить неверный перевод.

en:
  activerecord:
    errors:
      models:
        some_model:
          attributes:
            email:
              invalid: "FOO"

Ссылка: http://edgeguides.rubyonrails.org/i18n.html#error-message-interpolation