web-dev-qa-db-fra.com

rails 4 before_validation sur:: créer ou sur:: enregistrer

J'ai un cas qui tourne autour de ma tête.

J'ai un modèle d'image que je ne souhaite enregistrer que s'il est téléchargé. J'ai également besoin d'informations provenant du téléchargement pour valider l'image (comme la hauteur et la largeur). Mais je veux seulement que le téléchargement se produise si quelqu'un essaie d'enregistrer le fichier l'image pour la première fois.

J'ai donc pensé que la meilleure option serait d'avoir un before_validation, mais j'aimerais qu'il ne s'exécute que lors de la sauvegarde!

Mon code est sur ce Gist https://Gist.github.com/andreorvalho/b21204977d2b70fdef8

Donc, la partie bizarre est cette on: :save et on: :create ont des comportements vraiment bizarres ou du moins pas ce à quoi je m'attendais.

Quand je l'ai mis comme on: :save Si j'essaye de faire un image.save sur un test, je peux voir mon before_validation les rappels ne sont pas exécutés!

Si je mets on: :create est exécuté dans toutes les situations, peu importe si j'ai exécuté image.save, image.create ou image.valid?

Je suppose donc que cela ne fonctionne pas ou que je comprends mal l'objectif de ceux sur les paramètres.

p.s. ma validation lors de la création, se produit également dans toutes les situations enregistrer, créer ou valider?

laissez-moi savoir si quelqu'un est tombé sur le même ou sait pourquoi n'est pas censé fonctionner comme ça.

32
andre.orvalho

Le before_validation le rappel permet des restrictions à des événements particuliers dans le cycle de vie d'un objet.

Vous pouvez utiliser la syntaxe suivante:

before_validation :set_uuid, on: :create
before_validation :upload_to_system, on: [:create, :update]

Voici la documentation de cette option pour Rails 4. , Rails 5.2 et Rails 6. .

63
Jon