2
votes

Faire une action après le téléchargement du fichier avec Active Storage

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?


1 commentaires

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 ?


3 Réponses :


0
votes

Vérifiez les rappels (after_create, after_save, etc.) dans les modèles de rails et les options "on:: create" et "update".


0 commentaires

5
votes

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? }


2 commentaires

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 # "



0
votes

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 à votre modèle code> et définissez-le sur true une fois votre action terminée avec succès. Utilisez un before_update car Antarr Byrd suggéré de vérifier après que chaque photo est jointe à votre modèle .


0 commentaires