2009-10-23 9 views
55

Je viens de mettre à jour mes rails à 2.3.4 et je l'ai remarqué avec des validations: Disons que j'ai un simple modèle de société qui a un nom. Rien pour le faire. Je veux lancer ma propre validation:l'appel des méthodes de validation personnalisées dans Rails

class Company < ActiveRecord::Base 

    validate :something 


    def something 
    false 
    end 

end 

sauver le modèle fonctionne en fait dans ce cas. La même chose arrive si je substitue validate() et retourne false. Je l'ai remarqué dans un modèle plus complexe où ma validation renvoyait faux, mais l'objet était encore en train de sauver ... Je l'ai essayé dans un modèle essentiellement vide et la même chose a été appliquée. Y a-t-il une nouvelle pratique qui me manque? Cela ne semble pas être le cas dans certains de mes anciens codes de rails.

+0

Merci. C'est presque certainement le cas. Je suppose qu'avec le nouveau projet, j'ai oublié d'ajouter des erreurs, et avec les plus anciennes, je les ai définitivement incluses. Duh. Merci à tous. – cgr

Répondre

107

Vos validations sont exécutées lorsque vous utilisez la méthode validate. Cependant, les rails ne dépendent pas de la valeur retournée.

Il repose sur s'il y a des erreurs de validation ou non. Vous devriez donc ajouter des erreurs lorsque votre modèle ne valide pas.

def something 
    errors.add(:field, 'error message') 
end 

Ou, si l'erreur est pas liée à un champ:

def something 
    errors.add(:base, 'error message') 
end 

Ensuite, votre modèle ne sera pas sauvé parce qu'il ya des erreurs.

+0

soigné, merci! ceci est utile – marcgg

+0

add_to_base n'est plus correct à partir de Rails 3. Voir la réponse @ MagedMakled. – Undistraction

+0

Je viens de mettre à jour la réponse. Je vous remercie. –

14

Vous êtes confus entre les validations et les rappels.

Les validations sont supposées échouer s'il y a des erreurs sur l'objet, peu importe ce que la validation retourne. Les rappels échouent s'ils renvoient la valeur false, même s'ils ajoutent des erreurs à l'objet.

Rails utilise des appels valides? d'enregistrer les appels qui ne vérifie pas le résultat de toute validation. Rails traite validate :method comme rappel, mais valide? ne vérifie toujours pas leurs résultats, seulement pour les erreurs qu'ils ont ajoutées à l'objet.

Je ne pense pas que ce comportement a changé du tout mais je peux me tromper. Je ne pense pas avoir jamais écrit une validation pour retourner faux avant.

+1

J'essayais de créer une validation pour new_records, j'ai donc créé une méthode à utiliser avec le rappel Obj.before_validation_on_create et ajouté quelques erreurs de base. Cependant, l'objet serait créé même si mon callback ajoutait une erreur de base. Cela a seulement fonctionné quand j'ai fait mon retour de rappel "faux" comme vous l'avez suggéré! Merci d'indiquer comment faire échouer le callback – Coderama

8

Juste Pour votre information errors.add_to_base('error message') a été dépréciée dans des rails 3 mais j'ai remplacé par

errors[:base] << "Error message" 

Ou

errors.add(:base, "Error message") 
Questions connexes