2012-01-27 10 views
14

Sembra che Paperclip non rispetti il ​​modello dirty di ActiveRecord. Come posso rilevare la modifica nel callback after_save.Come rilevare se un allegato di graffetta è stato modificato in call_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 

Nota

so di poter rilevare la variazione di before_save richiamata utilizzando avatar.dirty? chiamata, ma la bandiera dirty è impostato su false dopo il salvataggio.

È possibile aggiungere un processore, ma è necessario eseguire le azioni dopo aver salvato i dati del modello.

risposta

26

Si potrebbe provare ad accedere al metodo _changed? per uno degli attributi:

if avatar_updated_at_changed? 
    # do something 
end 
+1

questo è quello che sto facendo adesso. Mi chiedo se c'è un metodo migliore. –

+1

Hai mai trovato una soluzione migliore? –

3

Quando ho bisogno di accesso a questi dati dopo il salvataggio, io di solito prendere questo approccio:

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

Per migliorare la qualità del tuo post, includi come/perché il tuo post risolverà il problema. –

+0

C'è un problema nel codice di check_for_avatar_changes ... Se la funzione restituisce false, il modello non verrà salvato, perché è un callback before_save. – Christian

Problemi correlati