spanish rails multi locales language i18n ruby-on-rails error-handling localization internationalization message

multi - Ruby on Rails i18n-Quiero traducir mensajes personalizados en modelos



rails multi language (4)

Acabo de leer todo esto y encontré las guías de los rieles para los validadores personalizados demasiado codificadas ... Lo publico aquí aunque no es exactamente lo que preguntaste, pero el título Q encaja perfectamente (por eso leí esta publicación para mi problema).

Validación personalizada con el mensaje 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!"

Tengo atributos con validación especial donde uso la cláusula de mensaje para mostrar un mensaje especial solo para esa validación. Aquí hay un ejemplo:

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

Me gustaría traducir el mensaje aquí, pero no estoy seguro de cómo hacerlo.

He visto ejemplos donde escriben algo como esto: message: t ("some_value_here"). No estoy seguro de la designación. Intenté algo como este mensaje: t (: bad_email). Hice lo siguiente en mi archivo yaml solo para probar algo.

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

Cuando intenté acceder a la aplicación Rails, recibí el siguiente error:

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

También probé esto en mi archivo yaml:

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

He estado investigando esto todo el día. Todo lo que puedo encontrar es reemplazar hashes de error incorporados como en blanco o vacíos. ¿Hay alguna forma de que tenga hashes de error personalizados y los reemplace en el modelo? En este punto, no puedo hacer que la t funcione como está codificada. Mi esperanza es que el problema es cómo tengo mi archivo yaml configurado. He visto diferentes versiones de cómo configurar esto. No estoy seguro de si debería poner esto en activemodel o activerecord. Asumí el modelo activo ya que es donde el mensaje personalizado es el que quiero traducir.

Cualquier ayuda sería apreciada. Esta es la última pieza que necesito descubrir antes de lanzar mi primera traducción de la aplicación.

ACTUALIZACIÓN 29/07/2013 7:30 p.m. CDT

bgates me dio un muy buen comienzo con la forma de configurar los archivos de mi modelo para recibir el mensaje personalizado en el archivo YAML. Sin embargo, terminé teniendo que hacer la siguiente configuración en mi archivo yaml para encontrar los mensajes personalizados.

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."


Daré un ejemplo completo.

Para que sus modelos sean más limpios, puede crear un método de validación de ayuda personalizado en un directorio completamente nuevo: app/validations , que Rails cargará automáticamente.

Llamaré a mi archivo time_validator.rb , ubicado en app/validations/time_validator.rb

Mi archivo tiene el siguiente código, que valida el tiempo ingresado por el usuario, que en realidad es el tiempo.

# 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

Puede leer más sobre cómo crear validaciones de ActiveRecord personalizadas here

Nuestro principal punto de preocupación es la línea record.errors . Tenga en cuenta que es attribute y no :attribute , donde attribute es la columna en su modelo.

:invalid_time es la clave que recupera el contenido traducido de su archivo de configuraciones regionales. En mi caso, este es el archivo:

en activerecord: errors: models: home: attributes: check_in_time: invalid_time: Please enter valid time check_out_time: invalid_time: Please enter valid time

Luego en el modelo de home :

validates :check_in_time, time: { allow_blank: true } validates :check_out_time, time: { allow_blank: true }

time se asigna automáticamente a la clase TimeValidator , y se ejecutan los métodos allí.

En caso de que se viole, ActiveRecord arrojará un error justo debajo del nombre de la columna.

¡Espero que esto ayude!



Use un símbolo para el mensaje:

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

luego en el archivo yaml

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

Si hay una traducción específica para este modelo, anulará la general anterior:

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

Si escribe validaciones personalizadas, add_error(:email, :bad_email) hará la búsqueda anterior, pero los errors[:email] << :bad_email no lo harán.