Ruby on Rails i18n-хотите перевести пользовательские сообщения в модели
у меня есть атрибуты со специальной проверкой, где я использую предложение message для отображения специального сообщения только для этой проверки. Вот один пример:
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."
4 ответов
используйте символ для сообщения:
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
не будет.
Я просто прошел через все это и нашел направляющие рельсы для пользовательских валидаторов слишком жестко... Я публикую это здесь, хотя это не совсем то, что вы просили, но название 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!"
решение этого не должно быть пользовательским;format
сообщение валидатора уже сопоставляется с :invalid
символ. Вам нужно только установить недопустимый в переводе.
en:
activerecord:
errors:
models:
some_model:
attributes:
email:
invalid: "FOO"
ссылка:http://edgeguides.rubyonrails.org/i18n.html#error-message-interpolation
я приведу полный пример.
чтобы сделать ваши модели пылесоса, вы can создайте пользовательский вспомогательный метод проверки в совершенно новом каталоге -app/validations
, который будет автоматически загружен рельсами.
Я позвоню в свой файл time_validator.rb
, расположенного по app/validations/time_validator.rb
мой файл имеет следующий код, который проверяет введенное пользователем время-это на самом деле времени.
# frozen_string_literal: true
class TimeValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
Time.parse(value).strftime('%H:%M')
rescue ArgumentError
record.errors.add(attribute, :invalid_time)
end
end
вы можете узнать больше о создании пользовательские проверки ActiveRecord здесь
наша главная забота-это record.errors
линии. Обратите внимание, что это attribute
, а не :attribute
, где attribute
является столбцом в вашей модели.
:invalid_time
- это ключ, который извлекает переведенное содержимое из файла локали. В моем случае, это :
en
activerecord:
errors:
models:
home:
attributes:
check_in_time:
invalid_time: Please enter valid time
check_out_time:
invalid_time: Please enter valid time
затем в home
модель:
validates :check_in_time, time: { allow_blank: true }
validates :check_out_time, time: { allow_blank: true }
time
автоматически сопоставляется с классом TimeValidator
, и методы в нем запускаются.
если это нарушено, ActiveRecord выдаст ошибку прямо под именем столбца.
надеюсь, что это помогает!