Forzar los nombres "humanizados" de los campos a ser minúsculas en Rails 3
-
27-10-2019 - |
Pregunta
Hasta donde yo sé, la forma aceptada de establecer los nombres "humanizados" de los campos en Rails 3 es usar locales:
# config/locales/en.yml
en:
activerecord:
attributes:
member:
username: 'username' # rather than 'Username'
Sin embargo, simplemente quiero que Rails 3 use versiones en minúsculas de sus nombres humanizados predeterminados.¿Existe una forma fácil e integrada de hacer esto?
Un ejemplo para ayudar a aclarar: cuando está dentro de un form_for
, <%= f.label :username %>
muestra "Nombre de usuario" por defecto.Quiero que muestre "nombre de usuario".
Solución
El asistente label
utiliza de forma predeterminada human_attribute_name paraconvertir un atributo en un nombre humano.Si observa la fuente, human_attribute_name
intenta algunas cosas antes de volver a attributes.to_s.humanize
.Primero intenta la traducción y luego busca una opción :default
en el hash de opciones.
Entonces, la mejor y más simple manera de obtener la funcionalidad que desea es anular human_attribute_name
con la suya propia que proporciona una opción :default
y luego llama al original.Rails proporciona una forma razonable de hacer este tipo de cosas con alias_method_chain
, así que ...
Ya escuché suficiente, ¡solo dame la respuesta!
Coloque lo siguiente en cualquier archivo en config/initializers
y reinicie su aplicación:
module ActiveModel
module Translation
def human_attribute_name_with_foo attribute, options = {}
human_attribute_name_without_foo attribute, options.merge( :default => attribute.humanize.downcase )
end
alias_method_chain :human_attribute_name, :foo
end
end
Otros consejos
Tuve el mismo problema. Lo resolví a través de css:
En foo.html.erb:
<%= f.label :username, :class => "my_class" %>
En bar.css:
label.my_class {
text-transform: lowercase;
}
Yo también preferiría una solución diferente.Pero ese es el único que he podido encontrar hasta ahora.