281 votes

Message d’erreur de validation

À l'aide de Rails je vais essayer d'obtenir un message d'erreur comme "La chanson de champ ne peut pas être vide" sur enregistrer. Procédant de la manière suivante:

validates_presence_of :song_rep_xyz, :message => "can't be empty"

... affiche seulement "Chanson Représentant XYW ne peut pas être vide", ce qui n'est pas bon parce que le titre le domaine n'est pas convivial. Comment puis-je changer le titre du champ lui-même ? Je pourrais changer le nom du champ dans la base de données, mais j'ai plusieurs "chanson" champs et j'ai besoin d'avoir des noms de champs spécifiques.

Je ne veux pas pirater autour des rails sur la validation des processus et je pense que cela doit être un moyen de fixation.

464voto

graywh Points 4425

Maintenant, la façon de définir le humanisé noms et des messages d'erreur personnalisés est d' utiliser les paramètres régionaux.

# config/locales/en.yml
en:
  activerecord:
    attributes:
      user:
        email: "E-mail address"
    errors:
      models:
        user:
          attributes:
            email:
              blank: "is required"

Maintenant, le humanisé nom et la présence de message de validation pour le "e-mail" attribut ont été modifiés.

Les messages de Validation peuvent être définies pour un modèle spécifique+attribut, le modèle, l'attribut, ou à l'échelle mondiale.

72voto

Federico Points 1306

Dans votre modèle:

validates_presence_of :address1, :message => "Put some address please" 

À votre avis

<% m.errors.each do |attr,msg|  %>
 <%=msg%>
<% end %>

Si vous faire à la place

<%=attr %> <%=msg %>

vous obtenez ce message d'erreur avec le nom de l'attribut

address1 Put some address please

si vous voulez obtenir le message d'erreur pour un seul attribut

<%= @model.errors[:address1] %>

68voto

Maulin Points 913

Essayez ceci.

class User < ActiveRecord::Base
  validate do |user|
    user.errors.add_to_base("Country can't be blank") if user.country_iso.blank?
  end
end

J'ai trouvé ce ici.

Voici une autre façon de le faire. Ce que vous faire est de définir un human_attribute_name méthode de la classe du modèle. La méthode est transmis le nom de la colonne comme une chaîne de caractères et retourne une chaîne de caractères à utiliser dans les messages de validation.

class User < ActiveRecord::Base

  HUMANIZED_ATTRIBUTES = {
    :email => "E-mail address"
  }

  def self.human_attribute_name(attr)
    HUMANIZED_ATTRIBUTES[attr.to_sym] || super
  end

end

Le code ci-dessus est à partir d' ici

20voto

Marcao Points 689

Oui, il y a une manière de le faire sans le plugin! Mais je n'est pas aussi propre et élégant, à l'aide de l'mentionnées plugin. Elle est ici.

En supposant que c'est de Rails 3 (je ne sais pas si c'est différent dans les versions précédentes),

gardez cela à votre modèle:

validates_presence_of :song_rep_xyz, :message => "can't be empty"

et à la vue, au lieu de les laisser

@instance.errors.full_messages

que ce soit lorsque nous utilisons l'échafaud générateur, mettre:

@instance.errors.first[1]

Et vous aurez juste le message que vous especified dans le modèle, sans le nom de l'attribut.

Explication:

#returns an hash of messages, one element foreach field error, in this particular case would be just one element in the hash:
@instance.errors  # => {:song_rep_xyz=>"can't be empty"}

#this returns the first element of the hash as an array like [:key,"value"]
@instance.errors.first # => [:song_rep_xyz, "can't be empty"]

#by doing the following, you are telleing ruby to take just the second element of that array, wich is the message.
@instance.errors.first[1]

Jusqu'à présent, nous sommes simplement afficher un seul message, toujours pour la première erreur. Si vous voulez afficher toutes les erreurs que vous pouvez faire une boucle dans la table de hachage et afficher les valeurs.

Espérons que cela a aidé.

12voto

Ryan Bigg Points 64561

Je recommande l'installation de la custom_error_message gem (ou plugin) écrit à l'origine par David Easley

Il vous permet de faire des trucs comme:

validates_presence_of :non_friendly_field_name, :message => "^Friendly field name is blank"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X