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 :asset
has_destroyable_file :asset
creé 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 end
fuente
attachment_definitions
me acaba de salvar la vida.attr_accessible :"delete_#{name}"
include DeletableAttachment
debajo de lashas_attached_file
declaraciones: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_delete
fuente
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_file
definiciones.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 end
fuente
Pude lograr esto con menos código, simplemente implementando un
delete_attachment
en 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 end
fuente