2012-01-27 1 views
14

Il semble que Paperclip n'honore pas le modèle sale ActiveRecord. Comment puis-je détecter la modification dans le rappel after_save.Comment détecter si un attachement en trombone a été modifié dans after_save callback?

class User 

    has_attachment :avatar  
    after_save :do_something 

    def do_something 
    if name_changed? 
     # 
    end 

    # How to determine avatar was changed? 
    #if avatar_changed? 
    # # 
    #end 

    end 
end 

Remarque

Je sais que je peux détecter le changement de rappel à l'aide before_saveavatar.dirty? appel, mais le drapeau dirty est défini à false après sauvegarde.

Je peux ajouter un processeur, mais je dois effectuer mes actions après l'enregistrement des données du modèle.

Répondre

26

Vous pouvez essayer d'accéder à la méthode _changed? pour l'un des attributs:

if avatar_updated_at_changed? 
    # do something 
end 
+1

C'est ce que je Je fais en ce moment. Je me demande s'il existe une meilleure méthode. –

+1

Avez-vous déjà trouvé une meilleure solution? –

3

Quand je besoin d'accéder à ces données sauvegarde après, je prends généralement cette approche:

class Foo 

    has_attachment :avatar 
    before_save :check_for_avatar_changes 
    after_save :do_something 

    def do_something 
    if @avatar_has_changes 
     # 
    end 
    end 

    def check_for_avatar_changes 
    @avatar_has_changes = self.avatar.dirty? 
    end 

end 
+0

Pour améliorer la qualité de votre message, veuillez indiquer comment/pourquoi votre article résoudra le problème. –

+0

Il y a un problème dans le code de check_for_avatar_changes ... Si la fonction retourne false, le modèle ne sera pas sauvegardé, car il s'agit d'un callback before_save. – Christian

Questions connexes