Używam Paperclip (w / Amazon s3) na Railsach 3. Chcę usunąć istniejący załącznik bez zastępowania go za pomocą akcji aktualizacji.
Znalazłem tylko jeden przykład to tutaj i że nie może dostać się do pracy, to po prostu nie usuwać i nie było nic w dziennikach powiedzieć dlaczego. Chciałem zrobić coś takiego na formularzu:
<%- unless @page.new_record? || [email protected]? -%>
<%= f.check_box :image_delete, :label => 'Delete Image' %>
<%- end -%>
(strona to nazwa modelu, obraz to nazwa atrybutu, w którym znajduje się załącznik)
Ale jak mogę wykryć to pole wyboru, a co ważniejsze, jak usunąć obraz? Doceniam każdą pomoc!
źródło
has_attached_file
o nazwie image, do którego lub ma go Page ma załącznik?self.image.clear if @image_delete == "1" and !image.dirty?
wdestroy_image?
metodziehas_attached_file :asset
=>
attr_accessor :delete_asset before_validation { asset.clear if delete_asset == '1' }
Nie ma potrzeby niszczenia zasobów, zrobi to Paperclip.
W formie
form.check_box(:delete_asset)
wystarczy.źródło
has_attached_file :asset
has_destroyable_file :asset
stworzyłem inicjator do dodania doconfig/initializers/
gist.github.com/3954054To jest odpowiedź Benoit, ale zapakowana w moduł i obejmująca skrajny przypadek zagnieżdżonych modeli atrybutów, w których pole wyboru zniszczenia jest jedyną zmianą w modelu.
Będzie dotyczyć wszystkich załączników w modelu.
# 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
źródło
attachment_definitions
właśnie uratował mi życie.attr_accessible :"delete_#{name}"
include DeletableAttachment
pod dowolnymihas_attached_file
stwierdzeniami:delete_<your_attribute>
jeśli używasz silnych parametrów w kontrolerzepamiętaj, aby dodać to również do swojego modelu strony:
attr_accessible :image_delete
źródło
Zmodyfikowana wersja rozwiązania Paula do obsługi niestandardowych atrybutów Rails 5. Chciałbym tylko, żeby był sposób na umieszczenie modułu na początku pliku, przed
has_attached_file
definicjami.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
źródło
Udało mi się to osiągnąć przy mniejszej ilości kodu, po prostu implementując a
delete_attachment
po stronie modelu .:class MyModel < ApplicationRecord has_attached_file :image def image_delete=(other) self.image = nil if other == "1" or other == true end end
źródło