2010-11-12 5 views
8

Je veux voir une valeur non valide dans le message de validation.Rails override validation message

validates_uniqueness_of :event, :scope => :user_id 

Résultat: "Titre a déjà a été prise" Je veux: "Event # {événement} a déjà été prise par # {user}"

je suis en train faire de cette façon, petit pain ne fonctionne pas:

validates_uniqueness_of :event, :scope => :user_id, :message=>"#{self.event} already has been taken by #{self.user}" 
+0

Je suppose que 'event' est une autre classe activemodel? –

+0

Juste par exemple. pas dans le vrai projet – murato

Répondre

11

de ActiveRecord code source commentaire:

Les valeurs: modèle,: attribut et : valeur sont toujours disponibles pour interpolation La valeur: comptage est disponible le cas échéant. Peut être utilisé pour la pluralisation.

Vous pouvez simplement écrire votre message

validates_uniqueness_of :event, :scope => :user_id, 
         :message=>"{{value}} is already taken" 
+1

Merci. Cela fonctionne, mais vous devez écrire {{value}} – murato

+0

Merci, mais existe-t-il un moyen de faire de la sortie '% {model}' un nom de modèle séparé de l'espace au lieu du nom du modèle avec seulement sa première lettre en majuscule? c'est à dire. RocketScience s'imprime sous le nom de Rocketscience, mais je serais satisfait de Rocket Science ou de la science des fusées lors de l'utilisation de '% {model}' dans mon interpolation. – mkelley33

5

utiliser un lambda:

validates_uniqueness_of :event, :scope => :user_id, :message=> lambda { |e| "#{e.event} already has been taken by #{e.user}"} 
+0

Cela provoque une erreur dans Rails4 –

5

Eh bien, en fait 3.x Rails il est ni% {{value}} ni {{value}} mais% {valeur}.

6

Utilisez un lambda, mais au moins dans les versions plus récentes de Rails, ActiveRecord essaiera de passer deux paramètres à ce lambda, et il doit en tenir compte. L'utilisation d'un simple exemple, disons que nous voulons assurer un nom d'utilisateur ne contient que des caractères alphanumériques:

validates_format_of :username, :with => /^[a-z0-9]+$/i, 
    :message => lambda{|x,y| "must be alphanumeric, but was #{y[:value]}"} 

Le premier paramètre passé à la lambda est un pas si petit symbole étrange, ce serait génial pour dire un robot qui a mal tourné:

:"activerecord.errors.models.user.attributes.username.invalid" 

(si vous êtes confus par la notation ci-dessus, les symboles peuvent contenir plus que des lettres, des nombres et underscore Mais s'ils le font, vous devez mettre des guillemets autour d'eux parce que sinon. :activerecord.errors semble que vous essayez d'appeler la méthode .errors lors d'un appel de symbole ed :activerecord.)

Le deuxième paramètre contient un hachage avec les champs qui vous aideront à "redresser" votre réponse aux erreurs. Si j'essaie d'ajouter un nom d'utilisateur avec ponctuation comme "Superstar !!!", cela ressemblera à ceci:

{ 
    :model=>"User", 
    :attribute=>"Username", 
    :value=>"Superstar!!!" 
}