2009-04-01 11 views
45

Przeczytałem, że errors.add_to_base powinno być używane do błędów związanych z obiektem, a nie określonym atrybutem. Mam problem z konceptualizacją tego, co to oznacza. Czy ktoś mógłby podać przykład, kiedy chciałbym użyć każdego?Ruby on Rails: errors.add_to_base vs. errors.add

Na przykład mam model zespołu, a każdy zespół ma gatunek. Kiedy potwierdzam obecność gatunku, jeśli gatunek nie jest dostępny, jeśli błąd zostanie dodany do bazy?

Im więcej przykładów tym lepiej

Dziękujemy!

+1

Zobacz trzecią odpowiedź na okres do dnia dzisiejszego (Rails 3+) roztworu –

Odpowiedz

35

Brakujący gatunek byłby błędem pola. Błąd podstawowy byłby dokładnym duplikatem istniejącego rekordu, w którym problem nie był związany z żadnym konkretnym polem, ale raczej z rekordem jako całością (lub przynajmniej z niektórymi kombinacjami pól).

31

W tym przykładzie można sprawdzić poprawność pola (należy wybrać zespół). Możesz zobaczyć walidację klasy/poziomu podstawowego. Na przykład, wymaga co najmniej jedną metodę kontaktu, telefon lub 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

Dzięki za wielkich przykładów . –

+0

Moja przyjemność :-) Więcej na http://technicaldebt.com –

97

Warto zauważyć (ponieważ pojawia się w wyszukiwarkach, co jest jak znalazłem go), że to jest przestarzałe. Szyny 3 sposób to zrobić to:

errors[:base] << "Error message"  

lub

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

Można również określić atrybut w Rails 3. 'errors.add (: name," Komunikat o błędzie ")' Cytat: http: //api.rubyonrails. org/classes/ActiveModel/Errors.html # method-i-add – scarver2

+3

Czy jest jakiś powód, aby preferować odkładanie szuflady do tablicy lub '# add'? – Yogh

+0

'.add' zezwala na opcje i ma domyślną wartość dla wiadomości, jeśli nie została podana. W przeciwnym razie są identyczne. – GSP