Mon modèle a un has_many_attached: photos
.
La première fois que ce modèle est créé, il contient 0 photo. Si j'exécute photos.attached?
J'obtiens false
.
Lorsque l'utilisateur télécharge des fichiers sur des photos, je dois effectuer certaines actions, mais uniquement la première fois. J'ai essayé d'utiliser before_update: if photos.attached?
. Mais j'ai besoin de savoir si l'utilisateur met à jour les photos spécifiquement.
Existe-t-il un moyen de savoir si l'utilisateur essaie de mettre à jour les photos? Ou existe-t-il un moyen simple de le faire?
3 Réponses :
Vérifiez les rappels (after_create, after_save, etc.) dans les modèles de rails et les options "on:: create" et "update".
Il existe la méthode dirty? que vous pouvez utiliser
class Post < ApplicationRecord has_many_attached :photos before_update :do_whatever, if: -> { photos.dirty? } def do_whatever # doing something end end
Vous pourrez peut-être aussi essayer before_update: do_whatever, if: -> {photos_changed? }
Je pense que la syntaxe correcte pour la dernière partie est -> {photos.changed?}
Je n'ai pas pu faire fonctionner cela. J'ai continué à obtenir l'erreur "méthode non définie` dirty 'pour #
Rails n'a pas ajouté la possibilité d'ajouter des validations aux pièces jointes. Voir Problème n ° 31656
Essayez cette approche:
Validez pour les
types mime
:<%= f.file_field :photos, accept: "image/png,image/gif,image/jpeg', multiple: true %>Vous devez encore ajouter des validations de modèle. Voir ce post Validation du type de contenu de l'actif Pièces jointes de stockage sur la façon d'utiliser un validateur personnalisé.
Pour limiter votre
action
à être exécutée une seule fois, vous pouvez ajouter un champ booléen à votremodèle code> et définissez-le sur
true
une fois votre action terminée avec succès. Utilisez unbefore_update
car Antarr Byrd suggéré de vérifier après que chaque photo est jointe à votre modèle .
Permettez-moi de clarifier les choses: vous devez savoir comment effectuer une action uniquement la première fois qu’une photo est jointe à votre
modèle
?