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."
Ответы
Ответ 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