Рельсы Скрепка, как удалить вложение? - PullRequest
83 голосов
/ 14 декабря 2010

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

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

<%- unless @page.new_record? || !@page.image? -%>
    <%= f.check_box :image_delete, :label => 'Delete Image' %>
<%- end -%>

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

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

Ответы [ 5 ]

100 голосов
/ 14 декабря 2010

Прежде всего, когда вы создаете 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», и когда пользователь будет сохранен, он проверит, удаляется ли изображение.

95 голосов
/ 09 ноября 2011

has_attached_file :asset

=>

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

Нет необходимости уничтожать актив, Paperclip сделает это.

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

12 голосов
/ 28 мая 2014

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

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

# 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
5 голосов
/ 11 августа 2011

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

attr_accessible :image_delete
0 голосов
/ 25 января 2018

Модифицированная версия решения Пола для поддержки пользовательских атрибутов 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
...