2009-04-01 5 views
45

Ich habe gelesen, dass errors.add_to_base für Fehler verwendet werden sollte, die mit dem Objekt und nicht einem bestimmten Attribut verbunden sind. Ich habe Schwierigkeiten zu verstehen, was das bedeutet. Könnte jemand ein Beispiel dafür geben, wann ich jedes verwenden möchte?Ruby on Rails: errors.add_to_base vs. errors.add

Zum Beispiel habe ich ein Band-Modell und jede Band hat ein Genre. Wenn ich das Vorhandensein eines Genres bestätige, sollte der Fehler zur Basis hinzugefügt werden, wenn das Genre fehlt?

Je mehr Beispiele, desto besser

Vielen Dank!

+1

dritte Antwort Siehe für aktuelle (Rails 3+) Lösung –

Antwort

35

Ein fehlendes Genre wäre ein Feldfehler. Ein Basisfehler wäre etwa ein exaktes Duplikat eines bestehenden Datensatzes, bei dem das Problem nicht an ein bestimmtes Feld gebunden ist, sondern an den Datensatz als Ganzes (oder zumindest an eine Kombination von Feldern).

31

In diesem Beispiel können Sie die Feldüberprüfung sehen (Team muss ausgewählt sein). Und Sie können eine Validierung auf Klassen-/Basisebene sehen. Zum Beispiel benötigt man mindestens eine Kontaktmethode, ein Telefon oder eine 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

Danke für die großartige Beispiele . –

+0

mein Vergnügen :-) Mehr auf http://technicaldebt.com –

97

Es ist erwähnenswert, (da diese in den Suchmaschinen auftaucht, das ist, wie ich es gefunden), dass diese veraltet. Die Rails 3 Art und Weise, es zu tun ist:

errors[:base] << "Error message"  

oder

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

Man kann auch das Attribut in Rails 3 angeben. 'Errors.add (: Name," Fehlermeldung ")' Citation: http: //api.rubyonrails. org/classes/ActiveModel/Errors.html # method-i-add – scarver2

+3

Gibt es einen Grund, entweder in das Array zu schaufeln oder '# add' zu wählen? – Yogh

+0

'.add' erlaubt Optionen und hat einen Standardwert für die Nachricht, falls nicht angegeben. Ansonsten sind sie identisch. – GSP