appeler des méthodes de validation personnalisées dans Rails

Je viens de mettre à jour mes rails vers la version 2.3.4 et je l’ai remarqué avec les validations: Disons que j’ai une société modèle simple qui a un nom. Rien pour le faire. Je veux lancer ma propre validation:

class Company < ActiveRecord::Base validate :something def something false end end 

sauvegarder le modèle fonctionne réellement dans ce cas. La même chose se produit si je remplace validate () et renvoie false. Je l’ai remarqué dans un modèle plus complexe où ma validation renvoyait faux, mais l’object était toujours en train de sauver … Je l’ai essayé dans un modèle essentiellement vide et la même chose 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.

Vos validations sont exécutées lorsque vous utilisez la méthode validate . Cependant, rails ne s’appuie pas sur la valeur renvoyée.

Il repose sur des erreurs de validation ou non. Vous devez donc append des erreurs lorsque votre modèle ne valide pas.

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

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

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

Ensuite, votre modèle ne sera pas enregistré car il y a des erreurs.

Vous êtes confus entre les validations et les rappels.

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

Rails utilise des appels valides? à partir des appels de sauvegarde qui ne vérifie pas le résultat des validations.

Edit: Rails traite validate :method comme rappel, mais valide? ne vérifie toujours pas leurs résultats, uniquement pour les erreurs qu’ils ont ajoutées à l’object.

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

Just FYI errors.add_to_base('error message') est devenu obsolète dans les rails 3 et a été remplacé par

 errors[:base] << "Error message" 

Ou

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