2009-04-01 5 views
45

Ho letto che errors.add_to_base dovrebbe essere usato per gli errori associati all'oggetto e non per un attributo specifico. Ho problemi a concettualizzare cosa significhi. Qualcuno potrebbe fornire un esempio di quando vorrei usarli?Ruby on Rails: errors.add_to_base vs. errors.add

Ad esempio, ho un modello Band e ogni Band ha un genere. Quando convalido la presenza di un genere, se il genere manca, l'errore deve essere aggiunto alla base?

Più esempi, meglio è

Grazie!

+1

Vedi terza risposta fino ad oggi (Rails 3+) soluzione –

risposta

35

Un genere mancante sarebbe un errore di campo. Un errore di base sarebbe qualcosa di simile a un duplicato esatto di un record esistente, in cui il problema non era legato a nessun campo specifico ma piuttosto al record nel suo insieme (o almeno a una combinazione di campi).

31

In questo esempio, è possibile visualizzare la convalida del campo (la squadra deve essere selezionata). E puoi vedere una convalida di classe/livello base. Ad esempio, è richiesto almeno un metodo di contatto, un telefono o una e-mail:

class Registrant 
    include MongoMapper::Document 

    # Attributes :::::::::::::::::::::::::::::::::::::::::::::::::::::: 
    key :name, String, :required => true 
    key :email, String 
    key :phone, String 

    # Associations ::::::::::::::::::::::::::::::::::::::::::::::::::::: 
    key :team_id, ObjectId 
    belongs_to :team 
... 
    # Validations ::::::::::::::::::::::::::::::::::::::::::::::::::::: 
    validate :validate_team_selection 
    validate :validate_contact_method 
... 

    private 

    def validate_contact_method 
    # one or the other must be provided 
    if phone.empty? and email.empty? 
     errors.add_to_base("At least one form of contact must be entered: phone or email") 
    end 
    end 

    def validate_team_selection 
    if registration_setup.require_team_at_signup 
     if team_id.nil? 
     errors.add(:team, "must be selected") 
     end 
    end 
    end 
end 
+0

Grazie per le grandi esempi . –

+0

il mio piacere :-) Altro su http://technicaldebt.com –

97

Vale la pena notare (dal momento che questo si presenta nei motori di ricerca, che è come l'ho trovato) che questo è deprecato. Il modo in Rails 3 di farlo è:

errors[:base] << "Error message"  

o

errors.add(:base, "Error message") 

http://apidock.com/rails/ActiveRecord/Errors/add_to_base
http://apidock.com/rails/v3.2.8/ActiveModel/Errors/add

+0

Si può anche specificare l'attributo in Rails 3. 'errors.add (: name," Error message ")' Citation: http: //api.rubyonrails. org/classes/ActiveModel/Errors.html # method-i-add – scarver2

+3

C'è un motivo per preferire o spalare nell'array o '# add'? – Yogh

+0

'.add' consente le opzioni e ha un valore predefinito per il messaggio se non specificato. Altrimenti sono identici. – GSP