Я использую Paperclip (w / Amazon s3) на Rails 3. Я хочу удалить существующее вложение, не заменяя его, с помощью действия обновления.
Я нашел здесь только один пример и не смог заставить его работать, он просто не удалялся, и в журналах не было ничего, чтобы сказать, почему. Я хотел сделать что-то вроде этого в форме:
<%- unless @page.new_record? || !@page.image? -%>
<%= f.check_box :image_delete, :label => 'Delete Image' %>
<%- end -%>
(страница - это имя модели, изображение - это имя атрибута, содержащего вложение)
Но как мне обнаружить этот флажок и, что более важно, как удалить изображение? Я ценю любую помощь!
источник
has_attached_file
, или у страницы есть вложение с именем image?self.image.clear if @image_delete == "1" and !image.dirty?
indestroy_image?
has_attached_file :asset
=>
attr_accessor :delete_asset before_validation { asset.clear if delete_asset == '1' }
Не нужно уничтожать актив, Скрепка это сделает.
По форме
form.check_box(:delete_asset)
хватит.источник
has_attached_file :asset
has_destroyable_file :asset
Я создал инициализатор для добавления вconfig/initializers/
gist.github.com/3954054Это ответ Бенуа, но завернутый в модуль и покрывающий крайний случай моделей вложенных атрибутов, где галочка уничтожения - единственное, что изменилось в модели.
Он будет применяться ко всем насадкам модели.
# 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
источник
attachment_definitions
только что спас мне жизнь.attr_accessible :"delete_#{name}"
include DeletableAttachment
под любымиhas_attached_file
утверждениями:delete_<your_attribute>
если вы используетене забудьте добавить это и в свою модель страницы:
attr_accessible :image_delete
источник
Модифицированная версия решения Пола для поддержки настраиваемых атрибутов Rails 5. Я просто хотел бы, чтобы был способ включить модуль в начало файла, перед
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
источник
Этого удалось добиться с меньшим количеством кода, просто реализовав
delete_attachment
на стороне модели:class MyModel < ApplicationRecord has_attached_file :image def image_delete=(other) self.image = nil if other == "1" or other == true end end
источник