rails ruby-on-rails ruby paperclip

ruby-on-rails - paperclip rails



Rails Paperclip cómo eliminar los archivos adjuntos? (5)

En primer lugar, cuando creas un check_box en form_for (que parece que eres), el formulario debe enviar por defecto: image_delete como "1" si está marcado y "0" si no está marcado. La declaración del método se ve así:

def check_box(method, options = {}, checked_value = "1", unchecked_value = "0")

Lo que muestra que puede asignar otros valores si lo desea, pero que, por supuesto, es opcional.

En segundo lugar, la llamada para eliminar manualmente un archivo adjunto sin eliminar la instancia del modelo al que está conectado es:

@page.image.destroy #Will remove the attachment and save the model @page.image.clear #Will queue the attachment to be deleted

Y para lograr su forma de eliminar las imágenes a través de una casilla de verificación, quizás agregue algo como esto a su modelo de Página:

class Page < ActiveRecord::Base has_attached_file :image before_save :destroy_image? def image_delete @image_delete ||= "0" end def image_delete=(value) @image_delete = value end private def destroy_image? self.image.clear if @image_delete == "1" end end

De esta manera, cuando crea su formulario y agrega la casilla de verificación: image_delete, cargará el valor predeterminado "0" de la instancia de Usuario. Y si ese campo está marcado, el controlador actualizará image_delete a "1" y cuando se guarde el usuario, se comprobará si la imagen se va a eliminar.

Estoy utilizando Paperclip (con Amazon s3) en Rails 3. Deseo eliminar un archivo adjunto existente sin reemplazarlo mediante una acción de actualización.

Solo he encontrado un ejemplo de esto here y no pude conseguir que funcione, simplemente no se eliminó y no había nada en los registros que dijera 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 -%>

(página es el nombre del modelo, la imagen es el nombre del atributo que contiene el archivo adjunto)

Pero, ¿cómo puedo detectar esa casilla de verificación y, lo que es más importante, cómo elimino la imagen? ¡Agradezco cualquier ayuda!


Esta es la respuesta de Benoit, pero envuelta en un módulo y que cubre el caso límite de los modelos de atributos anidados, donde el tickbox de destrucción es el único cambio en el modelo.

Se aplicará a todos los archivos adjuntos en el 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


Versión modificada de la solución de Paul, para admitir los atributos personalizados de Rails 5. Solo desearía que hubiera una manera de incluir el módulo en la parte superior del archivo, antes de has_attached_file definiciones de has_attached_file .

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


recuerde agregar esto a su modelo de página también:

attr_accessible :image_delete


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.