form ruby-on-rails-3 validation internationalization format formtastic

ruby on rails 3 - Rails i18n: cambiando de.errors.format: "%{attribute}%{message}" no tiene efecto



activeadmin datepicker (1)

Usamos algunas validaciones auto escritas para nuestras aplicaciones. Estos no usan uno de los ya traducidos como ''vacío'' o ''inválido''. Están formateados por la forma predeterminada "% {attribute}% {message}"

Sin embargo, nuestros clientes exigen formatearlos en "% {attribute} : % {message} . ", Solo algunas puntuaciones agregadas.

Estos son los mensajes de error en el cliente i18n:

errors: models: foo: attributes: bar: steak_missing: sie haben Ihr Schnitzel vergessen beer_missing: sie haben Ihr Bier vergessen

Llevando a feo

Bar sie haben Ihr Schnitzel vergessen

Dado que estos pueden estar encadenados, necesitamos tenerlos así:

Bar: sie haben Ihr Schnitzel vergessen, sie haben Ihr Bier vergessen.

Teniendo esto cambiado en la base i18n:

errors: &errors format: ! "%{attribute}: %{message}."

No muestra ningún efecto. Tampoco lo elimina totalmente ni nada más. Estamos utilizando formtastic y sus semántica_errors , ¿proporciona su propio i18n para mensajes de error (predeterminados)?


Si entiendo correctamente su pregunta, utiliza algo como esto en sus formularios:

<%= f.semantic_errors :bar %>

Para cambiar el comportamiento de los semantic_errors , puedes aplicar un parche mono a este método. Para hacer esto simplemente agregue el archivo {RAILS_ROOT}/config/initializers/semantic_errors_patch.rb con contenido:

Formtastic::Helpers::ErrorsHelper.class_eval do def semantic_errors(*args) html_options = args.extract_options! args = args - [:base] full_errors = args.inject([]) do |array, method| attribute = localized_string(method, method.to_sym, :label) || humanized_attribute_name(method) errors = Array(@object.errors[method.to_sym]).to_sentence errors.present? ? array << [attribute, errors].join(": ") : array ||= [] end full_errors << @object.errors[:base] full_errors.flatten! full_errors.compact! return nil if full_errors.blank? html_options[:class] ||= "errors" template.content_tag(:ul, html_options) do Formtastic::Util.html_safe(full_errors.map { |error| template.content_tag(:li, Formtastic::Util.html_safe(error)) }.join) end end end

Este parche funciona bien con formtastic 2.2.1 y rails 3.2.13 .

Este parche producirá la siguiente cadena para dos errores:

Bar: sie haben Ihr Schnitzel vergessen und sie haben Ihr Bier vergessen.

Si hay más errores, producirá algo como:

Importe: no es un número, no puede estar en blanco y es demasiado corto (mínimo 2 caracteres)

Puedes resaltar este comportamiento en esta línea:

errors = Array(@object.errors[method.to_sym]).to_sentence

@object.errors[method.to_sym] - es una colección de errores que produce cadena de errors finales.