2009-04-01 14 views
45

He leído que errors.add_to_base debería utilizarse para los errores asociados con el objeto y no un atributo específico. Tengo problemas para conceptualizar lo que esto significa. ¿Podría alguien proporcionar un ejemplo de cuándo me gustaría usar cada uno?Ruby on Rails: errors.add_to_base vs. errors.add

Por ejemplo, tengo un modelo de banda y cada banda tiene un género. Cuando valido la presencia de un género, si el género falta, ¿debería agregarse el error a la base?

Cuantos más ejemplos, mejor

¡Gracias!

+1

Ver tercera respuesta para al día (carriles 3 +) solución –

Respuesta

35

Un género faltante sería un error de campo. Un error de base sería algo así como un duplicado exacto de un registro existente, donde el problema no estaba vinculado a ningún campo específico, sino al registro como un todo (o al menos a una combinación de campos).

31

En este ejemplo, puede ver la validación del campo (se debe elegir el equipo). Y puede ver una validación de nivel de clase/base. Por ejemplo, se requiere al menos un método de contacto, un teléfono o un correo electrónico:

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

Gracias por los buenos ejemplos . –

+0

mi placer :-) Más sobre http://technicaldebt.com –

97

Vale la pena señalar (ya que esto aparece en los motores de búsqueda, que es como lo encontré) que esto está en desuso. La forma Carriles 3 de hacerlo es:

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

También se puede especificar el atributo en Rails 3. 'errors.add (: name," Mensaje de error ")' Citación: http: //api.rubyonrails. org/classes/ActiveModel/Errors.html # method-i-add – scarver2

+3

¿Hay alguna razón para preferir palear en la matriz o '# add'? – Yogh

+0

'.add' permite opciones y tiene un valor predeterminado para el mensaje si no se proporciona. De lo contrario, son idénticos. – GSP