Estou usando Paperclip (w / Amazon s3) no Rails 3. Eu quero excluir um anexo existente sem substituí-lo usando uma ação de atualização.
Eu encontrei apenas um exemplo disso aqui e não consegui fazer com que funcionasse, simplesmente não excluía e não havia nada nos logs para dizer o porquê. Eu queria fazer algo assim no formulário:
<%- unless @page.new_record? || [email protected]? -%>
<%= f.check_box :image_delete, :label => 'Delete Image' %>
<%- end -%>
(página é o nome do modelo, imagem é o nome do atributo que contém o anexo)
Mas como faço para detectar essa caixa de seleção e, mais importante, como faço para excluir a imagem? Agradeço qualquer ajuda!
fonte
has_attached_file
, ou a Página tem o anexo, imagem chamada?self.image.clear if @image_delete == "1" and !image.dirty?
nodestroy_image?
métodohas_attached_file :asset
=>
attr_accessor :delete_asset before_validation { asset.clear if delete_asset == '1' }
Não há necessidade de destruir o ativo, o Paperclip fará isso.
Na forma
form.check_box(:delete_asset)
será suficiente.fonte
has_attached_file :asset
has_destroyable_file :asset
criei um inicializador para adicionar aconfig/initializers/
gist.github.com/3954054Esta é a resposta de Benoit, mas embrulhada em um módulo e cobrindo o caso extremo dos modelos de atributos aninhados, onde a caixa de seleção de destruição é a única coisa alterada no modelo.
Ele se aplicará a todos os acessórios do 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
fonte
attachment_definitions
acabei de salvar minha vida.attr_accessible :"delete_#{name}"
include DeletableAttachment
abaixo de quaisquerhas_attached_file
declarações:delete_<your_attribute>
se de permitir se você estiver usando parâmetros fortes em seu controladorlembre-se de adicionar isso ao seu modelo de página também:
attr_accessible :image_delete
fonte
Versão modificada da solução de Paul, para suportar atributos customizados do Rails 5. Eu só queria que houvesse uma maneira de incluir o módulo no topo do arquivo, antes das
has_attached_file
definições.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
fonte
Consegui fazer isso com menos código, apenas implementando um
delete_attachment
no lado do modelo:class MyModel < ApplicationRecord has_attached_file :image def image_delete=(other) self.image = nil if other == "1" or other == true end end
fonte