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 выдаст ошибку прямо под именем столбца.

надеюсь, что это помогает!