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.