복붙노트

[RUBY-ON-RAILS] 종이 클립은 어떻게 첨부 파일을 삭제 난간?

RUBY-ON-RAILS

종이 클립은 어떻게 첨부 파일을 삭제 난간?

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

나는 단지 여기의 한 예를 발견했습니다 작업에, 그냥 삭제하지 않을 것이라고 가져올 수 없습니다 왜 말을 로그에 아무것도 없었다. 나는 양식에 이런 일을하고 싶어 :

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

(페이지 모델의 이름, 이미지 첨부 보유 속성 이름이다)

하지만 어떻게 그 체크 박스를 감지 않고 더 중요한 것은, 어떻게 이미지를 삭제합니까? 난 어떤 도움을 주셔서 감사합니다!

해결법

  1. ==============================

    1.첫째는 당신이 (당신처럼 보이는)는 form_for에 CHECK_BOX을 만들 때, 다음 양식은 기본 보내기로한다 : "1"로 image_delete 확인 경우 "0"으로 선택하지 않은 경우. 메소드 선언은 다음과 같다 :

    첫째는 당신이 (당신처럼 보이는)는 form_for에 CHECK_BOX을 만들 때, 다음 양식은 기본 보내기로한다 : "1"로 image_delete 확인 경우 "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"을로드합니다. 해당 필드를 선택하면 그 다음 컨트롤러는 사용자가 저장 될 때 이미지가 삭제 될 경우 "1"과, 그것을 확인합니다하기 위해 image_delete를 업데이트합니다.

  2. ==============================

    2.has_attached_file : 자산

    has_attached_file : 자산

    =>

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

    필요가 종이 클립이 그것을 할 것입니다, 자산을 파괴 없습니다.

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

  3. ==============================

    3.(가) tickbox 모델에 변경된 유일 파괴 곳 벤와의 대답하지만, 모듈에 싸여, 중첩 된 속성 모델의 가장자리 케이스를 덮고있다.

    (가) tickbox 모델에 변경된 유일 파괴 곳 벤와의 대답하지만, 모듈에 싸여, 중첩 된 속성 모델의 가장자리 케이스를 덮고있다.

    이 모델의 모든 첨부 파일에 적용됩니다.

    # 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. ==============================

    4.너무 귀하의 페이지 모델이 추가해야합니다 :

    너무 귀하의 페이지 모델이 추가해야합니다 :

    attr_accessible :image_delete
    
  5. ==============================

    5.지원 바울의 솔루션의 수정 된 버전은 5 개 사용자 지정 특성을 레일. 난 그냥 has_attached_file 정의하기 전에 파일의 맨 위에있는 모듈을 포함 할 수있는 방법이 있었으면.

    지원 바울의 솔루션의 수정 된 버전은 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
    
  6. from https://stackoverflow.com/questions/4435826/rails-paperclip-how-to-delete-attachment by cc-by-sa and MIT license