2010-11-02 25 views
6

Tengo un modelo de usuario con un campo 'correo electrónico'.Rieles: nombres de campos

En mi opinión, he hecho que la etiqueta para este campo 'Dirección de correo electrónico' de la siguiente manera:

<%= form_for(:user) do |f| %> 
    <%= f.label :email, 'Email address' %><br/
    <%= f.text_field :email %> 
<% end %> 

Sin embargo, cuando se generan errores de validación, 'Correo electrónico' se utiliza en su lugar:

de correo electrónico no es válida

¿hay algo que pueda añadir al modelo de forma que: correo electrónico siempre se presta a 'dirección de correo electrónico' en lugar de simplemente 'correo electrónico'?

Muchas gracias

Respuesta

4

Ampliación comentarios GJB, me acaba de agregar esto a config/inicializadores/inflections.rb:

ActiveSupport::Inflector.inflections do |inflect| 
    inflect.human 'email', 'Email address' 
end 

creo que esto es mucho más ordenado.

+0

De acuerdo, esta es una solución mucho más ordenada. – gjb

1
validates_presence_of :email, :message => "address cannot be blank" 
1

Hay 2 maneras de manejar esto. O bien cambiar el nombre de la columna a email_address o modificar la validación en el modelo de usuario (recomendado):

validates_presence_of :email, :message => "Address cannot be blank..." 

las cuales deben emitir: "Dirección de correo electrónico no puede estar en blanco ..." en la vista.

7

No necesita cambiar el nombre de las columnas de la tabla para hacer esto. Hay una solución muy limpia:

class User < ActiveRecord::Base 
    HUMAN_ATTRIBUTE_NAMES = { 
    :email => 'Email address', 
    :first_name => 'First name' 
    } 

    class << self 
    def human_attribute_name attribute_name 
     HUMAN_ATTRIBUTE_NAMES[attribute_name.to_sym] || super 
    end 
    end 
end 

Lo que hemos hecho es crear un hash de atributos en los que queremos personalizar los nombres. No tiene que enumerarlos todos, ya que muchos nombres de atributos funcionarán de la forma que usted desee. Luego, reemplazamos el método human_attribute_name de ActiveRecord, para tratar de encontrar primero el nombre en nuestro hash.

Esto hace dos cosas realmente geniales: ya no tiene que especificar etiquetas personalizadas en sus formularios, y sus mensajes de error también tendrán los nuevos nombres automáticamente. Como beneficio adicional, ahora se puede utilizar estos nombres dondequiera que usted desee, llamando al:

<%= User.human_attribute_name(:email) %> 

Esto crea un enfoque más unificado para nombrar. Si desea cambiar "correo electrónico" a "correo electrónico" la próxima semana, solo tiene que hacerlo en un solo lugar.

Espero que esto ayude!

+0

Jaime, eres un genio absoluto. ¡Muchas gracias! – gjb

+1

Resulta que human_attribute_name está actualmente en desuso en favor de inflexiones. Ahora me he decidido por ActiveSupport :: Inflector.inflections {| inflect | inflect.human 'email', 'Email address'} como alternativa. – gjb

+1

Creo que ya no es verdad. * Hace un par de años que fue * desaprobado, pero ha vuelto a subir a favor, y ahora incluso incluye soporte i18n (al menos en los rieles 3). Es difícil golpear un objetivo en movimiento, pero creo que human_attribute_name ya no está en la tabla de cortar :) –

Cuestiones relacionadas