web-dev-qa-db-fra.com

Ruby on Rails: errors.add_to_base vs. errors.add

J'ai lu que errors.add_to_base devrait être utilisé pour les erreurs associées à l'objet et non à un attribut spécifique. J'ai du mal à conceptualiser ce que cela signifie. Est-ce que quelqu'un pourrait fournir un exemple de quand je voudrais utiliser chacun?

Par exemple, j'ai un modèle de groupe et chaque groupe a un genre. Lorsque je valide la présence d'un genre, si le genre manque, faut-il ajouter l'erreur à la base?

Plus il y a d'exemples, mieux c'est

Je vous remercie!

48
Tony

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

38
MarkusQ

Il convient de noter (car cela apparaît dans les moteurs de recherche, c'est ainsi que je l'ai trouvé) que cela est obsolète. La manière Rails 3 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

105
GSP

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 avez besoin d'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
33
Jon Kern