J'utilise Paperclip (avec Amazon s3) sur Rails 3. Je souhaite supprimer une pièce jointe existante sans la remplacer à l' aide d'une action de mise à jour.
Je n'ai trouvé qu'un exemple de cela ici et je n'ai pas pu le faire fonctionner, cela ne serait tout simplement pas supprimé et il n'y avait rien dans les journaux pour dire pourquoi. Je voulais faire quelque chose comme ça sur le formulaire:
<%- unless @page.new_record? || [email protected]? -%>
<%= f.check_box :image_delete, :label => 'Delete Image' %>
<%- end -%>
(page est le nom du modèle, image est le nom de l'attribut qui contient la pièce jointe)
Mais comment détecter cette case à cocher et, plus important encore, comment supprimer l'image? J'apprécie toute aide!
la source
has_attached_file
, ou la page a-t-elle la pièce jointe, nommée image?self.image.clear if @image_delete == "1" and !image.dirty?
endestroy_image?
méthodehas_attached_file :asset
=>
attr_accessor :delete_asset before_validation { asset.clear if delete_asset == '1' }
Pas besoin de détruire un actif, Paperclip le fera.
Dans la forme
form.check_box(:delete_asset)
suffira.la source
has_attached_file :asset
has_destroyable_file :asset
j'ai créé un initialiseur à ajouter àconfig/initializers/
gist.github.com/3954054C'est la réponse de Benoit, mais enveloppée dans un module, et couvrant le cas de bord des modèles d'attributs imbriqués où la case à cocher détruire est la seule chose modifiée sur le modèle.
Il s'appliquera à toutes les pièces jointes du modèle.
# 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
la source
attachment_definitions
vient de me sauver la vie.attr_accessible :"delete_#{name}"
include DeletableAttachment
sous toutes leshas_attached_file
déclarations:delete_<your_attribute>
si vous utilisez des paramètres forts dans votre contrôleurn'oubliez pas de l'ajouter également à votre modèle de page:
attr_accessible :image_delete
la source
Version modifiée de la solution de Paul, pour prendre en charge les attributs personnalisés de Rails 5. Je souhaite juste qu'il y ait un moyen d'inclure le module en haut du fichier, avant les
has_attached_file
définitions.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
la source
A pu y parvenir avec moins de code, en implémentant simplement un
delete_attachment
côté modèle:class MyModel < ApplicationRecord has_attached_file :image def image_delete=(other) self.image = nil if other == "1" or other == true end end
la source