내가 사용하고 종이 클립을 레일 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