2009-04-01 8 views
45

J'ai lu que errors.add_to_base doit être utilisé pour les erreurs associées à l'objet et non pour un attribut spécifique. J'ai de la difficulté à conceptualiser ce que cela signifie. Quelqu'un pourrait-il donner un exemple de quand je voudrais utiliser chacun?Ruby on Rails: errors.add_to_base vs errors.add

Par exemple, j'ai un modèle de bande et chaque bande a un genre. Quand je valide la présence d'un genre, si le genre manque, l'erreur doit-elle être ajoutée à la base?

Plus d'exemples, mieux c'est

Merci!

+1

Voir la troisième réponse jusqu'à ce jour la solution (Rails 3+) –

Répondre

35

Un genre manquant serait une erreur de champ. Une erreur de base serait quelque chose comme une copie exacte d'un enregistrement existant, où le problème n'était pas lié à un champ spécifique mais plutôt à l'ensemble de l'enregistrement (ou à une combinaison de plusieurs champs).

31

Dans cet exemple, vous pouvez voir la validation du champ (l'équipe doit être choisie). Et vous pouvez voir une validation de niveau classe/base. Par exemple, vous devez au moins une méthode de contact, un téléphone ou un 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

Merci pour les bons exemples . –

+0

mon plaisir :-) Plus sur http://technicaldebt.com –

97

Il convient de noter (car cela apparaît dans les moteurs de recherche, ce qui est de savoir comment je l'ai trouvé) que cela est dépréciée. Les rails 3 façon de le faire est:

errors[:base] << "Error message"  

ou

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

On peut également spécifier l'attribut dans Rails 3. 'errors.add (: nom," message d'erreur ")' Citation: http: //api.rubyonrails. org/classes/ActiveModel/Errors.html # method-i-add – scarver2

+3

Y a-t-il une raison de préférer pelleter dans le tableau ou "# ajouter"? – Yogh

+0

'.add' permet des options et a une valeur par défaut pour le message s'il n'est pas donné. Sinon, ils sont identiques. – GSP