Je viens de mettre à jour mon Rails à 2.3.4 et je l'ai remarqué avec des validations: disons que j'ai un modèle de société simple qui a un nom. Rien à lui. Je veux exécuter ma propre validation:
class Company < ActiveRecord::Base
validate :something
def something
false
end
end
l'enregistrement du modèle fonctionne réellement dans ce cas. La même chose se produit si je remplace validate () et retourne false. J'ai remarqué cela dans un modèle plus complexe où ma validation retournait faux, mais l'objet était toujours en train de sauvegarder ... Je l'ai essayé dans un modèle essentiellement vide et la même chose s'est 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 Rails.
Vos validations sont exécutées lorsque vous utilisez la méthode validate
. Cependant Rails ne dépend pas de la valeur retournée.
Il dépend s'il y a des erreurs de validation ou non. Vous devez donc ajouter 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 vous confondez entre validations et rappels.
Les validations sont censées échouer s'il y a des erreurs sur l'objet, peu importe ce que renvoie la validation. Les rappels échouent s'ils retournent false, même s'ils ajoutent des erreurs à l'objet.
Rails utilise des appels valides? de sauvegarder les appels qui ne vérifie pas le résultat des validations.
Modifier: Rails traite validate :method
comme rappel, mais valide? ne vérifie toujours pas leurs résultats, seulement les erreurs qu'ils ont ajoutées à l'objet.
Je ne pense pas que ce comportement ait changé du tout, mais je peux me tromper. Je ne pense pas avoir déjà écrit une validation pour retourner false avant.
Juste FYI errors.add_to_base('error message')
a été déprécié dans Rails 3 et a été remplacé par
errors[:base] << "Error message"
Ou
errors.add(:base, "Error message")