2010-11-02 18 views
6

Ho un modello utente con un campo "email".Rotaie: nomi di campo

A mio parere, ho reso l'etichetta per questo campo come 'indirizzo e-mail' come segue:

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

Tuttavia, quando errori di convalida vengono generati, 'e-mail' è usato al posto:

email è valido

c'è qualcosa che posso aggiungere al modello in modo che: E-mail rende sempre all 'indirizzo e-mail' piuttosto che semplicemente 'e-mail'?

Molte grazie

risposta

4

Espansione commenti GJB, ho solo aggiunto che questo config/inizializzatori/inflections.rb:

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

Penso che questo sia molto più ordinato.

+0

Concordato, questa è una soluzione molto più ordinata. – gjb

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

Ci sono 2 modi per gestire questo. Rinominare la colonna a EMAIL_ADDRESS o modificare la validazione del modello utente (consigliato):

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

Che dovrebbe rendere: "Indirizzo e-mail non può essere vuota ..." nella vista.

7

Non è necessario rinominare le colonne della tabella per eseguire questa operazione. C'è una correzione molto pulito:

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 

Quello che abbiamo fatto è creare un hash di attributi in cui vogliamo personalizzare i nomi. Non è necessario elencarli tutti, poiché molti nomi di attributi funzioneranno fuori dalla scatola come si desidera. Quindi sostituiamo il metodo human_attribute_name di ActiveRecord, per cercare di trovare prima il nome nel nostro hash.

Questo fa davvero molto bene: non è più necessario specificare etichette personalizzate nei moduli e anche i messaggi di errore avranno automaticamente i nuovi nomi! Come bonus, è ora possibile utilizzare questi nomi dove vuoi, chiamando:

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

Questo crea un approccio più unificato alla denominazione. Se vuoi cambiare "email" a "e-mail" la prossima settimana, devi solo farlo in un posto.

Spero che questo aiuti!

+0

Jaime, sei un genio assoluto. Grazie mille! – gjb

+1

Si scopre che human_attribute_name è in realtà deprecato a favore delle flessioni. Ora ho optato per ActiveSupport :: Inflector.inflections {| inflect | inflect.human 'email', 'Email address'} in alternativa. – gjb

+1

Credo che non sia più vero. È stato * deprecato un paio di anni fa, ma è tornato a favore, e ora include anche il supporto i18n (almeno nelle rotaie 3). È difficile colpire un bersaglio in movimento, ma credo che human_attribute_name non sia più sul ceppo :) –