Rails Paperclip как удалить приложение?

Я использую Paperclip (с Amazon s3) в Rails 3. Я хочу удалить существующее вложение без его замены используя действие обновления.

Я нашел только один пример этого здесь и не мог заставить его работать, он просто не удалял, и в журналах ничего не было сказано Зачем. Я хотел сделать что-то подобное в форме:

<%- unless @page.new_record? || [email protected]? -%>
    <%= f.check_box :image_delete, :label => 'Delete Image' %>
<%- end -%>

(страница - это имя модели, изображение - это имя атрибута, которое содержит вложение)

Но как определить этот флажок и, что более важно, как удалить изображение? Я ценю любую помощь!

Ответ 1

Во-первых, когда вы создаете check_box в form_for (как он выглядит, как вы), форма должна по умолчанию отправлять: image_delete как "1", если флажок установлен, и "0", если он не установлен. Объявление метода выглядит следующим образом:

def check_box(method, options = {}, checked_value = "1", unchecked_value = "0")

Что показывает, что вы можете назначить другие значения, если хотите, но это, конечно, необязательно.

Во-вторых, вызов вручную удалить вложение без удаления экземпляра модели, к которому он присоединен, равен:

@page.image.destroy #Will remove the attachment and save the model
@page.image.clear #Will queue the attachment to be deleted

И чтобы выполнить свой способ удаления изображений с помощью флажка, возможно, добавьте что-то вроде этого к вашей модели страницы:

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

Таким образом, когда вы создаете форму и добавляете флажок: image_delete, она будет загружать значение по умолчанию "0" из экземпляра пользователя. И если это поле отмечено, тогда контроллер обновит файл image_delete до "1", и когда пользователь будет сохранен, он проверяет, должно ли оно быть удалено.

Ответ 2

has_attached_file :asset

= >

    attr_accessor :delete_asset
    before_validation { asset.clear if delete_asset == '1' }

Не нужно уничтожать активы, это сделает Паперклип.

В форме form.check_box(:delete_asset) будет достаточно.

Ответ 3

Это ответ Benoit, но завернутый в модуль и охватывающий краевой регистр вложенных моделей атрибутов, где уничтожение тикбокса - единственное, что изменилось на модели.

Он применим ко всем вложениям на модели.

# 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

Ответ 4

Не забудьте добавить это и к своей модели страницы:

attr_accessible :image_delete