Estoy usando Paperclip (con Amazon s3) en Rails 3. Quiero eliminar un archivo adjunto existente sin reemplazarlo usando una acción de actualización.
Solo encontré un ejemplo de esto aquí y no pude hacer que funcionara, simplemente no se borraba y no había nada en los registros para decir por qué. Quería hacer algo como esto en el formulario:
<%- unless @page.new_record? || [email protected]? -%>
<%= f.check_box :image_delete, :label => 'Delete Image' %>
<%- end -%>
(la página es el nombre del modelo, la imagen es el nombre del atributo que contiene el archivo adjunto)
Pero, ¿cómo detecto esa casilla de verificación y, lo que es más importante, cómo elimino la imagen? ¡Agradezco cualquier ayuda!
fuente

has_attached_file, o la página tiene el archivo adjunto, imagen con nombre?self.image.clear if @image_delete == "1" and !image.dirty?indestroy_image?has_attached_file :asset=>
attr_accessor :delete_asset before_validation { asset.clear if delete_asset == '1' }No es necesario destruir el activo, Paperclip lo hará.
En la forma
form.check_box(:delete_asset)será suficiente.fuente
has_attached_file :assethas_destroyable_file :assetcreé un inicializador para agregar aconfig/initializers/gist.github.com/3954054Esta es la respuesta de Benoit, pero envuelta en un módulo y que cubre el caso de borde de los modelos de atributos anidados donde la casilla de verificación de destrucción es lo único que ha cambiado en el modelo.
Se aplicará a todos los archivos adjuntos del modelo.
# This needs to be included after all has_attached_file statements in a class module DeletableAttachment extend ActiveSupport::Concern included do attachment_definitions.keys.each do |name| attr_accessor :"delete_#{name}" before_validation { send(name).clear if send("delete_#{name}") == '1' } define_method :"delete_#{name}=" do |value| instance_variable_set :"@delete_#{name}", value send("#{name}_file_name_will_change!") end end end endfuente
attachment_definitionsme acaba de salvar la vida.attr_accessible :"delete_#{name}"include DeletableAttachmentdebajo de lashas_attached_filedeclaraciones:delete_<your_attribute>si está utilizando parámetros fuertes en su controladorrecuerde agregar esto también a su modelo de página:
attr_accessible :image_deletefuente
Versión modificada de la solución de Paul, para admitir atributos personalizados de Rails 5. Solo desearía que hubiera una forma de incluir el módulo en la parte superior del archivo, antes de las
has_attached_filedefiniciones.module Mixins module PaperclipRemover extend ActiveSupport::Concern included do attachment_definitions.keys.each do |name| attribute :"remove_#{name}", :boolean before_validation do self.send("#{name}=", nil) if send("remove_#{name}?") end end end end endfuente
Pude lograr esto con menos código, simplemente implementando un
delete_attachmenten el lado del modelo:class MyModel < ApplicationRecord has_attached_file :image def image_delete=(other) self.image = nil if other == "1" or other == true end endfuente