web-dev-qa-db-fra.com

appel de méthodes de validation personnalisées dans Rails

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.

58
cgr

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.

110
Damien MATHIEU

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.

15
EmFi

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")
8
Maged Makled