2012-01-27 8 views
14

Parece que Paperclip no respeta el modelo sucio ActiveRecord. ¿Cómo puedo detectar el cambio en la devolución de llamada after_save?¿Cómo detectar si se ha cambiado un archivo adjunto de clip en la devolución de llamada after_save?

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

Sé que puedo detectar el cambio en before_save devolución de llamada usando avatar.dirty? llamada, pero la bandera dirty se establece en false después de guardar.

Puedo agregar un procesador, pero debo realizar mis acciones después de guardar los datos del modelo.

Respuesta

26

Usted podría intentar acceder al método _changed? para uno de los atributos:

if avatar_updated_at_changed? 
    # do something 
end 
+1

Esto es lo que yo estoy haciendo ahora. Me pregunto si hay un mejor método. –

+1

¿Alguna vez se le ocurrió una solución mejor? –

3

Cuando necesito acceso a estos datos después de guardar, normalmente adoptar este enfoque:

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

Para mejorar la calidad de su publicación, por favor incluya cómo y por qué su publicación resolverá el problema. –

+0

Hay un problema en el código de check_for_avatar_changes ... Si la función devuelve false, el modelo no se guardará, porque es una devolución de llamada before_save. – Christian

Cuestiones relacionadas