[ruby-on-rails] Rails Paperclip 첨부 파일을 삭제하는 방법?

내가 사용하고 종이 클립을 레일 3. 내가 기존 첨부 파일을 삭제하려면 (/ 아마존 S3 W) 를 교체하지 않고 업데이트 작업을 사용.

여기 에서 한 가지 예만 찾았고 작동하지 못했습니다. 삭제되지 않았고 로그에 이유를 말할 수있는 내용이 없었습니다. 나는 다음과 같은 양식을 작성하고 싶었습니다.

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

(페이지는 모델 이름, 이미지는 첨부 파일이있는 속성 이름)

그러나이 확인란을 어떻게 감지하고 더 중요한 것은 이미지를 어떻게 삭제합니까? 도와 주셔서 감사합니다!



답변

먼저 form_for에 check_box를 만들면 (당신처럼 보이는), 양식은 기본적으로 : 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 확인란을 추가 할 때 User 인스턴스에서 기본값 “0”이로드됩니다. 해당 필드가 선택되면 컨트롤러는 image_delete를 “1”로 업데이트하고 사용자가 저장 될 때 이미지를 삭제할 것인지 확인합니다.


답변

has_attached_file :asset

=>

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

자산을 파괴 할 필요가 없습니다. Paperclip이 해드립니다.

양식으로 form.check_box(:delete_asset)충분합니다.


답변

이것은 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


답변

이것을 페이지 모델에도 추가하는 것을 잊지 마십시오.

attr_accessible :image_delete


답변

Rails 5 사용자 정의 속성을 지원하도록 Paul 솔루션의 수정 된 버전. 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


답변